文档章节

创建型模式之四:建造者模式

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:35
字数 516
阅读 18
收藏 0

建造者模式的关键特征是他涉及一个逐步的过程去构建东西。例如,每个产品会通过相同的过程,不同的是过程中的步骤不同。 在下面的例子中,我们能定义一个饮料的建造者叫StarbuscksBuilder,他将通过一系列的步骤来建造一杯叫Starbucks的饮料,像buildSize()方法和buildDrink方法,最后会返回已建造的饮料。

建造者模式类图

建造者模式Java代码

1
package designpatterns.builder;
 
// produce to be built
class Starbucks {
 private String size;
 private String drink;
 
 public void setSize(String size) {
 this.size = size;
 }
 
 public void setDrink(String drink) {
 this.drink = drink;
 }
}
 
//abstract builder
abstract class StarbucksBuilder {
 protected Starbucks starbucks;
 
 public Starbucks getStarbucks() {
 return starbucks;
 }
 
 public void createStarbucks() {
 starbucks = new Starbucks();
 System.out.println("a drink is created");
 }
 
 public abstract void buildSize();
 public abstract void buildDrink();
}
 
// Concrete Builder to build tea
class TeaBuilder extends StarbucksBuilder {
 public void buildSize() {
 starbucks.setSize("large");
 System.out.println("build large size");
 }
 
 public void buildDrink() {
 starbucks.setDrink("tea");
 System.out.println("build tea");
 }
 
}
 
// Concrete builder to build coffee
class CoffeeBuilder extends StarbucksBuilder {
 public void buildSize() {
 starbucks.setSize("medium");
 System.out.println("build medium size");
 }
 
 public void buildDrink() {
 starbucks.setDrink("coffee");
 System.out.println("build coffee");
 }
}
 
//director to encapsulate the builder
class Waiter {
 private StarbucksBuilder starbucksBuilder;
 
 public void setStarbucksBuilder(StarbucksBuilder builder) {
 starbucksBuilder = builder;
 }
 
 public Starbucks getstarbucksDrink() {
 return starbucksBuilder.getStarbucks();
 }
 
 public void constructStarbucks() {
 starbucksBuilder.createStarbucks();
 starbucksBuilder.buildDrink();
 starbucksBuilder.buildSize();
 }
}
 
//customer
public class Customer {
 public static void main(String[] args) {
 Waiter waiter = new Waiter();
 StarbucksBuilder coffeeBuilder = new CoffeeBuilder();
 
 //Alternatively you can use tea builder to build a tea
 //StarbucksBuilder teaBuilder = new TeaBuilder();
 
 waiter.setStarbucksBuilder(coffeeBuilder);
 waiter.constructStarbucks();
 
 //get the drink built
 Starbucks drink = waiter.getstarbucksDrink();
 
 }
}

在java标准库中,StringBuilder 继承了 AbstractStringBuilder

StringBuilder strBuilder= new StringBuilder();
strBuilder.append("one");
strBuilder.append("two");
strBuilder.append("three");
String str= strBuilder.toString();

这个append()是过程中的一步,就像在Starbucks例子中的一步,toString()方法是最后一步,但是不同的是这是没有图中的waiter,在上图的建造者模式中waiter类扮演了一个导演的角色,但是这是没有这样的角色,所以他不是建造者模式。 当然,这不是唯一的原因,我们能对比类图的开始,并找到其他原因。 建造者模式用于,当需要许多步来构造一个对象,工厂模式用于,当很容易在一个方法中就构建一个实体对象。 

以上文章翻译自: http://www.programcreek.com/2013/02/java-design-pattern-builder/

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
【设计模式】建造者模式 Builder Pattern

前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的...

风之源
08/04
0
0
设计模式快速学习(四)建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。将一个复杂的构建与其表示相分离,使...

微笑面对Life
前天
0
0
炒冷饭系列:设计模式 建造者模式

炒冷饭系列:设计模式 建造者模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是建造者模式 ...

泥沙砖瓦浆木匠
2014/07/28
0
0
创建型模式--建造者模式(Builder)

工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后...

shanxi_liyong
2014/12/23
0
0
07、建造者模式--Builder

本节课程大纲 PS:转载请注明出处 作者: TigerChain 地址: http://www.jianshu.com/p/300cbb9ee7f2 本文出自 TigerChain 简书 人人都会设计模式 教程简介 1、阅读对象 本篇教程适合新手阅读,...

TigerChain
2017/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

kernel version does not match DSO version

错误信息: kernel version 384.11 does not match DSO version 384.130.0 原因是: cuda driver版本太低,不匹配DSO 简单有效的修复方法,升级nvidia driver, 步骤如下: 1. google seach ...

刘小米
今天
0
0
maven坐标和依赖

一、maven坐标详解 <groupId>com.fgt.club</groupId><artifactId>club-common-service-facade</artifactId><version>3.0.0</version><packaging>jar</packaging> maven的坐标元素说......

老韭菜
今天
1
0
springmvc-servlet.xml配置表功能解释

问:<?xml version="1.0" encoding="UTF-8" ?> 答: xml version="1.0"表示是此xml文件的版本是1.0 encoding="UTF-8"表示此文件的编码方式是UTF-8 问:<!DOCTYPE beans PUBLIC "-//SPRING//......

隐士族隐逸
今天
1
0
基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
今天
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部