1.应用场景

在软件的设计中,我们可能经常会遇到需要构建某个复杂的对象(比如在游戏开发中,进行人物角色的构建),建造该对象的“过程”是稳定的(对于一个人设来都有身体,脸,发型,手脚等),而具体建造的“细节”是不同的(每个人设的身体,脸等各有千秋)。但对于用户来讲,我才不管这些,我只想告诉你,我现在需要某个对象(拥有某特征的人物角色),于是你就创建一个给我就行了。

如果你需要将一个复杂对象的 构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要应用于一个设计模式,“建造者(Builder)模式”,又叫生成器模式。建造者模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们使用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了

2. 概念

封装一个对象的构造过程,并允许按步骤构造。

3. Class Diagram

  • Builder:是为创建一个Product对象的各个部件指定的抽象接口。
  • ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件。
  • Director:构建一个使用Builder接口的对象。
  • Product:表示被构建的复杂对象。

4. Implementation

public class AbstractStringBuilder {protected char[] value;protected int count;public AbstractStringBuilder(int capacity) {count = 0;value = new char[capacity];}public AbstractStringBuilder append(char c) {ensureCapacityInternal(count + 1);value[count++] = c;return this;}private void ensureCapacityInternal(int minimumCapacity) {// overflow-conscious codeif (minimumCapacity - value.length > 0)expandCapacity(minimumCapacity);}void expandCapacity(int minimumCapacity) {int newCapacity = value.length * 2 + 2;if (newCapacity - minimumCapacity < 0)newCapacity = minimumCapacity;if (newCapacity < 0) {if (minimumCapacity < 0) // overflowthrow new OutOfMemoryError();newCapacity = Integer.MAX_VALUE;}value = Arrays.copyOf(value, newCapacity);}
}public class StringBuilder extends AbstractStringBuilder {public StringBuilder() {super(16);}@Overridepublic String toString() {// Create a copy, don't share the arrayreturn new String(value, 0, count);}
}public class Client {public static void main(String[] args) {StringBuilder sb = new StringBuilder();final int count = 26;for (int i = 0; i < count; i++) {sb.append((char) ('a' + i));}System.out.println(sb.toString());}
}运行结果:
abcdefghijklmnopqrstuvwxyz

5. 优点和缺点

5.1 优点

  • 将一个复杂对象的创建构成封装起来。
  • 允许对象通过多个步骤来创建,并且可以改变过程(这和只有一个步骤的工厂模式不同)
  • 想客户隐藏产品内部的实现
  • 产品的实现可以被替换,因为可只看到一个抽象的接口。

5.2 用途和缺点

  • 经常用来创建组合结构。
  • 与工厂模式相比,采用生成器模式创建对象的客户,需要更多的领域知识。

6. JDK

  • java.lang.StringBuilder
  • java.nio.ByteBuffer
  • java.lang.StringBuffer
  • java.lang.Appendable
  • Apache Camel builders

Java设计模式(十六):生成器设计模式相关推荐

  1. JAVA架构师之路十六:设计模式之责任链模式

    JAVA架构师之路十五:设计模式之策略模式 责任链模式 1. 责任链模式 2. 登陆案例 3. 登陆案例优化 人生的游戏不在于拿了一副好牌,而在于怎样去打好坏牌,世上没有常胜将军,勇于超越自我者才能得 ...

  2. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十五 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  3. 教妹学Java(二十六):static 关键字解析

    你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家.这是<教妹学 Java>专栏的第二十六篇,今天我们来谈谈 Java 的 static 关键字--什么是静态变量?什么是静态方 ...

  4. 教妹学Java(三十六):Java 多态的好处

    你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家.这是<教妹学 Java>专栏的第三十六篇,今天我们来谈谈 Java 中的多态--多态有什么好处? 本专栏中的代码已收录到 G ...

  5. 【设计模式十六之装饰模式】装饰者模式

    Decorator Pattern装饰模式 细说装饰模式 细说装饰模式 定义 UML模型 场景 场景一 场景二 代码 代码一 代码二 基于UML的代码 装饰模式应用和注意事项 细说装饰模式 提示: 博 ...

  6. Java设计模式(十):迭代器设计模式

    1.应用场景 (1)访问一个聚合对象的内容而无需暴露它的内部表示 (2)支持对聚合对象的多种遍历 (3)为遍历不同的聚合结构提供一个统一的接口 2.概念 提供一种顺序访问聚合对象元素的方法,并且不暴露 ...

  7. 设计模式(十六)----结构型模式之代理享元模式

    1.概述 定义: 运用共享技术来有效地支持大量细粒度对象的复用.它通过共享已经存在的对象来大幅度减少需要创建的对象数量.避免大量相似对象的开销,从而提高系统资源的利用率. 2 结构 享元(Flywei ...

  8. java(十六) 对象的this引用

    2019独角兽企业重金招聘Python工程师标准>>> 1. java提供的this的关键字总是指向调用该方法的对象. 2. 根据this出现位置的不同,this作为默认引用有两种情 ...

  9. 设计模式(六)------设计模式六大原则(5):迪米特法则

    转载自:http://www.jianshu.com/p/14589fb6978e (作者简书:涅槃1992) 揭秘迪米特法则 迪米特法则(Law of demeter,缩写是LOD)要求:一个对象应 ...

最新文章

  1. go html vue,用Go+Vue.js快速搭建一个Web应用(初级demo)
  2. DL之SegNet:SegNet图像分割/语义分割算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  3. oracle存储照片,[oracle]中存储图片
  4. 深度学习试题_高中生物:今年高考试题3点显著变化及5个备考建议!不看准吃亏...
  5. aix系统java堆_浅谈AIX环境下的Java性能调优
  6. MySQL运行一段时间后自动停止问题的排查
  7. matplotlib -work4
  8. winform上传文件解决方案
  9. 易语言升级版火山软件开发平台现在很庞大了
  10. TP-LINK无线上网短信Wifi认证配置流程
  11. 影片avi转rmvb教程
  12. 计算机网络编程(转载)
  13. MACD顶背离和底背离是什么(图解)
  14. “非著名相声演员”郭德纲【ZZ】
  15. Beyong Compare 4 提示 “这个授权已被吊销” 的解决办法
  16. python里面and和or用法
  17. 如何制作一个蓄力跳的功能
  18. 产品读书《长尾理论》
  19. Kubernetes(K8s)Events介绍(上)
  20. 为什么手机玩我的世界进服务器会显示红字,LOL进去时显示的蓝红标志是什么 | 手游网游页游攻略大全...

热门文章

  1. JAVA 双重检查锁定和延迟初始化
  2. 完全背包问题 POJ1384
  3. 半导体制冷器性能计算
  4. 函数要多小才够好——谈小函数之道
  5. Java web程序中备份oracle数据库
  6. Fedora 30可能默认启用DNF的best模式
  7. 微型计算机的外存储器可与 直接打交道,微型计算机的外存储器可与( )直接打交道。...
  8. oracle 根据分隔符提取,oracle根据分隔符获取字符串
  9. python 钉钉机器人自定义发送文件_Python自定义钉钉机器人发送自动化结果报告...
  10. 010_静态资源的配置和常用请求配置