一. 定义  将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示。

二. 结构 




三. 参与者

Builder : 为创建一个Product对象的各个部件指定抽象接口。
ConcreteBuilder : 实现Builder的接口以构造和装配该产品的各个部件。定义并明确它所创建的表示。提供一个检索产品的接口。
Director : 构造一个使用(聚合:has-a的关系)Builder接口的对象。如下文代码ChefDirector类。
Product : 表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类, 包括将这些部件装配成最终产品的接口。

四. 时序图

从图中可以看出来Builder模式一个特点就是将内容集中生成, 然后输出。 常见例子就是StringBuilder的append方法, 一直append, 然后最终生成一个String。

五. 代码实现:

厨师作为水果沙拉的制作指挥者, 下令做沙拉, 具体细节不管。

package com.wenniuwuren.builder;
/**  * 厨师指挥者类  * @author wenniuwuren  *  */
public class ChefDirector {  private FruitSaladBuilder fruitSaladBuilder;  // 持有当前所需要的构建器对象      public  ChefDirector (FruitSaladBuilder fruitSaladBuilder) {   this.fruitSaladBuilder = fruitSaladBuilder;   }  // 制造水果沙拉public void constructFruitSalad() {  fruitSaladBuilder.buildSalad();fruitSaladBuilder.buildApple();fruitSaladBuilder.buildWaterMelon();}
}  

水果沙拉制作接口:规定制作沙拉方法, 具体实现交给实现类ConcreteFruitSaladBuilder

package com.wenniuwuren.builder;
/**  * 制作水果沙拉接口* @author wenniuwuren  *  */
public interface FruitSaladBuilder {  // 添入沙拉酱public void buildSalad();  // 添入西瓜public void buildWaterMelon();  // 加入苹果public void buildApple(); // 便于Client得到最后的Resultpublic FruitSaladProduct getFruitSaladProduct();   }  

水果沙拉具体制作:

package com.wenniuwuren.builder;
/**  * 实际制作沙拉  * @author wenniuwuren  *  */
public class ConcreteFruitSaladBuilder implements FruitSaladBuilder {FruitSaladProduct fruitSaladProduct = new FruitSaladProduct();// 添入沙拉酱public void buildSalad() {fruitSaladProduct.setSalad("沙拉酱");}// 添入西瓜public void buildWaterMelon() {fruitSaladProduct.setWatermelon("西瓜");}// 加入苹果public void buildApple() {fruitSaladProduct.setApple("苹果");}  // 便于Client得到最后的Result@Overridepublic FruitSaladProduct getFruitSaladProduct() {return fruitSaladProduct;}}  

水果沙拉产品: 保存着制作水果沙拉的水果种类

package com.wenniuwuren.builder;
/**  * FruitSalad产品  * @author wenniuwuren  *  */
public class FruitSaladProduct {  private String apple;  private String watermelon;  private String salad;public String getApple() {return apple;}public void setApple(String apple) {this.apple = apple;}public String getWatermelon() {return watermelon;}public void setWatermelon(String watermelon) {this.watermelon = watermelon;}public String getSalad() {return salad;}public void setSalad(String salad) {this.salad = salad;}
}  

测试类:

package com.wenniuwuren.builder;
/*** 测试类* @author wenniuwuren**/
public class Client {public static void main(String[] args) {FruitSaladBuilder appleSaladBuilder = new ConcreteFruitSaladBuilder();// Builder当成参数传入接受指挥ChefDirector chefDirector = new ChefDirector(appleSaladBuilder);// 内部连续添加材料chefDirector.constructFruitSalad();// 一次性输出FruitSaladProduct fruitSaladProduct = appleSaladBuilder.getFruitSaladProduct();System.out.println("沙拉的配料是:" + fruitSaladProduct.getSalad() + ", "+ fruitSaladProduct.getWatermelon() + ", "+ fruitSaladProduct.getApple());}
}

输出结果:

沙拉的配料是:沙拉酱, 西瓜, 苹果

六. 总结

正如上述代码实现, Builder设计模式将具体的实现隐藏在Builder中, 指挥者Director无需关心细节。 这个和Abstract Factory很相似, 但是区别在于Builder在于一步步构造对象, 最后一次性输出, 而Abstract Factory注重于多个系列的产品的生产, 并且它是立即返回结果的。

参考书籍

《设计模式:可复用面向对象软件的基础》

深入浅出设计模式 ------ Builder(生成器模式)相关推荐

  1. 设计模式--Builder生成器模式

    GOF<设计模式>中说道:将一个复杂对象的构建与其表示向分离,使得同样的构建过程可以创建不同的表示.    所谓"复杂对象",是指:此对象中还含有其它的子对象.    ...

  2. [设计模式] —— Builder 生成器模式

    文章目录 Builder 生成器模式 动机 定义 示例代码 结构图 总结 Builder 生成器模式 动机 面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构 ...

  3. 2018.3.31 设计模式之生成器模式详解及例子(对象创建型模式)

    设计模式之生成器模式(对象创建型模式) 1.定义/概念 将一个复杂对象的创建和它的表示分离,使得同样的创建过程可以有不同的表示. 2.生成模式角色 Builder: 生成器接口,定义创建一个Produ ...

  4. Builder生成器模式

    这次来学习另一个创建型设计模式:Builder生成器模式. GOF对Builder模式的定义 (1)意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. (2)适用性 1. ...

  5. C#设计模式 之 生成器模式

    C#设计模式 之 生成器模式 一,意图 二,动机 三,结构 四,优缺点 五,应用场景 六,代码实现 别名:建造者模式.Builder 一,意图   将一个复杂的对象的构建与其表示相分离,使得同样的构建 ...

  6. C#设计模式系列 8 ----Builder 生成器模式之--发工资了,带老婆到 岗顶百脑汇配置电脑...

    1.理论定义 生成器模式 又叫:建造者模式,它  可以 把一个 复杂的对象,分步骤创建. 2.应用举例 需求描述:话说发工资了,打算去岗顶百脑汇  给老婆配置一台电脑. OK,坐着BRT,就出发了. ...

  7. 研磨设计模式 之 生成器模式(Builder)2 ——跟着cc学设计系列

    8.2  解决方案 8.2.1  生成器模式来解决 用来解决上述问题的一个合理的解决方案就是生成器模式.那么什么是生成器模式呢? (1)生成器模式定义 (2)应用生成器模式来解决的思路 仔细分析上面的 ...

  8. Builder(生成器模式) 创建型

    生成器模式 一.概述 二.结构 三.适用场景 四.优缺点 五.实例 一.概述 生成器是一种创建型设计模式,使你能够分步骤创建复杂对象.该模式允许你使用相同的创建 代码生成不同类型和形式的对象. 二.结 ...

  9. JAVA23种设计模式之生成器模式

    生成器模式 生成器模式是一种对象的创建模式,可以将一个复杂产品的内部表象和产品的生产过程分隔开来,(构建与表示分离).使得同样的构建过程可以创建不同的表示. 简单的来说,就是讲一个复杂的对象拆分成一个 ...

最新文章

  1. c语言调用视频播放软件,C语言播放视频
  2. 什么工作,未来可以走创业路线?
  3. 计算机网络 陆魁军 ppt,计算机网络的应用基础概述.doc
  4. 数据结构-算法: 分配排序(基数分配排序法)
  5. 随机数生成算法-二谈
  6. 减小TabLayout高度而不影响每个tab展示的几种方法
  7. 从零开始学python项目_从零开始可以这样学python
  8. 浅谈C++ STL中的优先队列(priority_queue)
  9. 全新威马E.5将于4月15日上市
  10. TensorFlow实战minist数据集(CNN)
  11. 在线体验四大名著情景(地图、游戏)
  12. 汽车DTC故障码格式解析
  13. Adobe dreamweaver CS6小白入门教程
  14. RouterOS(ROS)设置动态域名(DDNS)
  15. 数据库报错create connection SQLException,............ errorCode 1129, state HY000
  16. Win7电脑定时关机
  17. 予你45条古诗词,一读就觉得岁月静好....
  18. Reached heap limit Allocation failed - JavaScript heap out of memory
  19. linux nfs acl 特定ip,Linux NFS配置
  20. 指纹识别登录Windows Server服务器远程桌面

热门文章

  1. 微信小程序学习 (一)
  2. CSS美化默认滚动条
  3. k8s部署java应用
  4. mongo DB数据库bindIP的配置和我的理解(bindIP不是应用服务器的IP)
  5. python 练习题目
  6. 中文分词_中文分词01
  7. SourceInsight 修改代码后无法保存,显示“xxx is busy or opened by another process”
  8. JDK7-HashMap源码解析
  9. 电脑内存条分几种,如何分辨呢?
  10. 利用过滤器处理字符,解决中文乱码问题