(文章翻译自Java Design Pattern: Builder)

构造器模式的关键之处在于它使用一步接招一步的流程去构建东西,例如:尽管构建的每一步是不相同的但是每一个产品还是遵循相同的流程。

在下面的例子中,我们定义了一个叫做StarbucksBuilder 的饮料的构造器,它可以构造Starbucks饮料。StarbucksBuilder 在构建一个Starbucks饮料的时候有几个步骤,比如buildSize()和buildDrink(),最后返回了构建完成的饮料。

1.构造器模式类图

2.构造器模式设计Java代码例子:

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(); }
}

3.构造器模式的实际应用

构造器模式在大量的类库中得到了应用,但是他们犯了一个相同的错误。以下面的来自于Java标准类库中的StringBuilder为例,它真的使用了构造器模式吗??

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

在Java标准类库中,StringBuilder 继承了AbstractStringBuilder。

append() 是这个过程的一步,就像我们Starbucks 例子中的一步。toString()方法是另外一步也是最后一步。但是区别的是在图中没有waiter。Waiter在构造器模式中扮演主导的角色。因为它没有这样的角色所以它不是一个构造器模式。

当然了,这不是唯一的原因。你可以比较开始中的那张图并且找出其他的原因。

4.构造器和工程的区别

当有很多步奏去创建一个对象的时候才会用到构造器设计模式。而当工长很容易在一个方法调用的时候就创建了整个对象的时候会用到工长模式。

[译]ava 设计模式之构造器的更多相关文章

  1. [译]ava 设计模式之职责链

    (文章翻译自Java Design Pattern: Chain of Responsibility) 职责链模式的主要设计思想是为了构建一连串的处理单元,如果阈值满足的话那么这个单元就来处理这个请求 ...

  2. [译]ava 设计模式之享元

    (文章翻译自Java Design Pattern: Flyweight) 享元模式用于最小化内存开销.它做的就是使用其他相似的对象尽可能多的分享数据. 1.享元模式类图 2.享元模式Java代码 / ...

  3. [译]Java 设计模式之单例

    (文章翻译自Java Design Pattern: Singleton) 单例是在Java最经常被用到的设计模式.它通过阻止其他的实例化和修改来用于控制创建对象的数目.这一特性可应用于那些当只有一个 ...

  4. JavaScript设计模式之构造器、模块和原型

    JavaScript面向对象 JavaScript是一种无类语言,但可以使用函数来模拟,这就涉及到设计模式.模式是一种已经验证过的可复用的解决方案,可用于解决软件设计中遇到的常见的问题,通常将这些解决 ...

  5. Builder设计模式--改善构造器多个参数时可显著改善可读性

    作为一名程序开发者,设计模式其实一直有在接触,只是没有专门的去学过,所以可能对设计模式没有一个系统的理解.在一次项目中,需要使用到第三方服务商提供的功能,为了尽快的熟悉其功能代码,在官网下了demo来 ...

  6. javascript设计模式:构造器模式学习一

    javascript 设计模式1.简介javascript是一种弱类型语言,不过类可以通过函数模拟出来最常见的实现方法如下:function Car(model){ this.model = mode ...

  7. [译]Java 设计模式之桥接

    (文章翻译自Java Design Pattern: Bridge) 简单来说,桥梁设计模式是一个两层的抽象. 桥接模式就是从一个抽象中实现中解耦以便两个都可以独立的改变.桥接使用封装聚合而且使用继承 ...

  8. [译]Java 设计模式之装饰器

    (文章翻译自Java Design Pattern: Decorator – Decorate your girlfriend) 1.装饰模式的来历 让我们假设你在寻找一个女朋友.有来自像没美国中国日 ...

  9. [译]Java 设计模式 之模板方法

    (文章翻译自Java Design Pattern: Template Method) 模板方法设计模式定义了归档特定操作的工作流.它允许子类去修改特定的步奏而不用改变工作流的结构. 下面的例子表示模 ...

随机推荐

  1. [2011山东ACM省赛] Identifiers(模拟)

    Identifiers Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述  Identifier is an important ...

  2. Android和C#实时视频传输Demo

    说起去年的Demo.以今天的免费整齐优势. 原理很easy,虽然没有写android申请书.但,好了~ 高级语言是相通的.傲慢约.就这么简单研究了一下api后,找到相机对象有一个预览回调方法. 意识到 ...

  3. Java设计模式偷跑系列(十八)建模和责任链模式的实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每一 ...

  4. android 拍照注意问题

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, reqCode) ...

  5. 我的MYSQL学习心得(六)

    原文:我的MYSQL学习心得(六) 我的MYSQL学习心得(六) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL ...

  6. Oracle 树操作

    Oracle 树操作(select…start with…connect by…prior) oracle树查询的最重要的就是select…start with…connect by…prior语法了 ...

  7. css+html菜单适应性学习的宽度

    本文就是利用css和html自适应于文本菜单的长度. 后效果图实现,例如下列: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvajkwMzgyOTE4Mg= ...

  8. 关于Promise的一个案例

    题目:红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次:如何让三个灯不断交替重复亮灯?(用Promise实现) 解答思路一: function red(){ console.log('red'); } ...

  9. python_基础学习_01_按行读取文件的最优方法

    python 按行读取文件 ,网上搜集有N种方法,效率有区别,先mark最优答案,下次补充测试数据 with open('filename') as file: for line in file: d ...

  10. 《剑指offer》 相应 在线测试地址

    <剑指Offer>面试题集收录汇总 面试题1 赋值运算符函数 不适合在线模式 面试题2 实现Singleton模式 不适合在线模式 面试题3 二维数组中的查找 已收录 面试题4 替换空格 ...