(文章翻译自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. 【POJ3612】【USACO 2007 Nov Gold】 1.Telephone Wire 动态调节

    意甲冠军: 一些树高给出.行一种操作:把某棵树增高h,花费为h*h. 操作完毕后连线,两棵树间花费为高度差*定值c. 求两种花费加和最小值. 题解: 跟NOIP2014 D1T3非常像. 暴力动规是O ...

  2. SQL开发中容易忽视的一些小地方(二)

    原文:SQL开发中容易忽视的一些小地方(二) 目的:继上一篇:SQL开发中容易忽视的一些小地方(一) 总结SQL中的null用法后,本文我将说说表联接查询. 为了说明问题,我创建了两个表,分别是学生信 ...

  3. Oracle SQL操作计划基线总结(SQL Plan Baseline)

    一.基础概念 Oracle 11g開始,提供了一种新的固定运行计划的方法,即SQL plan baseline,中文名SQL运行计划基线(简称基线),能够觉得是OUTLINE(大纲)或者SQL PRO ...

  4. JavaEE(15) - JPA实体继承

    1. 实体继承映射的三种策略 #1. 整个类层次对应一张表 #2. 连接子类 #3. 每个具体类对应一张表 2. 使用抽象实体 3. 使用非实体父类 4. 重定义子类实体的外键列 ---------- ...

  5. Service与Activity与交流AIDL

    深圳旅游月.终于回来了,做了很多个月,这些天来的东西会慢慢总结出来的.今天,我们正在谈论的Service小东西:沟通. 固定通信的做法比较,基本上按照写模板可以实现. 1.Service与Activi ...

  6. Git 基本原理与经常使用命令

    平时使用过两种版本号控制软件 SVN 和 Git,平心而论,假设纯粹自己使用,那么绝对 Git 更加适合,本地库.远程库.离线工作.强大而灵活的分支.大名鼎鼎的Github, 这些都是选择 Git 的 ...

  7. Lenovo E46A-Win 7_无线灯亮但无法启动(耽误3天以上您信吗.....)问题: wlan autoconfig 依赖服务或组无法启动

    Lenovo E46A-Win 7_无线灯亮但无法启动(耽误3天以上您信吗.....)问题: wlan autoconfig 依赖服务或组无法启动 提示: windows7 无线连接服务wlan au ...

  8. c#有关udp可靠传输(包传输数据包) 升级

    在c#有关udp可靠传输(包传输数据包)我们讨论,UDP包的发送,可是上一个程序有一个问题.就是数据比較大.一个Message类序列化后都有2048B,而实际的数据量也就只是 50B罢了,这就说明当中 ...

  9. hdu Tempter of the Bone (奇偶剪枝)

    学习链接:http://www.ihypo.net/1554.html https://www.slyar.com/blog/depth-first-search-even-odd-pruning.h ...

  10. AlloyRenderingEngine

    AlloyRenderingEngine燃烧的进度条 写在前面 Github: https://github.com/AlloyTeam/AlloyGameEngine HTML 5新增了progre ...