Java设计模式(十六):生成器设计模式
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设计模式(十六):生成器设计模式相关推荐
- JAVA架构师之路十六:设计模式之责任链模式
JAVA架构师之路十五:设计模式之策略模式 责任链模式 1. 责任链模式 2. 登陆案例 3. 登陆案例优化 人生的游戏不在于拿了一副好牌,而在于怎样去打好坏牌,世上没有常胜将军,勇于超越自我者才能得 ...
- 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
设计模式 ( 十五 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...
- 教妹学Java(二十六):static 关键字解析
你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家.这是<教妹学 Java>专栏的第二十六篇,今天我们来谈谈 Java 的 static 关键字--什么是静态变量?什么是静态方 ...
- 教妹学Java(三十六):Java 多态的好处
你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家.这是<教妹学 Java>专栏的第三十六篇,今天我们来谈谈 Java 中的多态--多态有什么好处? 本专栏中的代码已收录到 G ...
- 【设计模式十六之装饰模式】装饰者模式
Decorator Pattern装饰模式 细说装饰模式 细说装饰模式 定义 UML模型 场景 场景一 场景二 代码 代码一 代码二 基于UML的代码 装饰模式应用和注意事项 细说装饰模式 提示: 博 ...
- Java设计模式(十):迭代器设计模式
1.应用场景 (1)访问一个聚合对象的内容而无需暴露它的内部表示 (2)支持对聚合对象的多种遍历 (3)为遍历不同的聚合结构提供一个统一的接口 2.概念 提供一种顺序访问聚合对象元素的方法,并且不暴露 ...
- 设计模式(十六)----结构型模式之代理享元模式
1.概述 定义: 运用共享技术来有效地支持大量细粒度对象的复用.它通过共享已经存在的对象来大幅度减少需要创建的对象数量.避免大量相似对象的开销,从而提高系统资源的利用率. 2 结构 享元(Flywei ...
- java(十六) 对象的this引用
2019独角兽企业重金招聘Python工程师标准>>> 1. java提供的this的关键字总是指向调用该方法的对象. 2. 根据this出现位置的不同,this作为默认引用有两种情 ...
- 设计模式(六)------设计模式六大原则(5):迪米特法则
转载自:http://www.jianshu.com/p/14589fb6978e (作者简书:涅槃1992) 揭秘迪米特法则 迪米特法则(Law of demeter,缩写是LOD)要求:一个对象应 ...
最新文章
- go html vue,用Go+Vue.js快速搭建一个Web应用(初级demo)
- DL之SegNet:SegNet图像分割/语义分割算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- oracle存储照片,[oracle]中存储图片
- 深度学习试题_高中生物:今年高考试题3点显著变化及5个备考建议!不看准吃亏...
- aix系统java堆_浅谈AIX环境下的Java性能调优
- MySQL运行一段时间后自动停止问题的排查
- matplotlib -work4
- winform上传文件解决方案
- 易语言升级版火山软件开发平台现在很庞大了
- TP-LINK无线上网短信Wifi认证配置流程
- 影片avi转rmvb教程
- 计算机网络编程(转载)
- MACD顶背离和底背离是什么(图解)
- “非著名相声演员”郭德纲【ZZ】
- Beyong Compare 4 提示 “这个授权已被吊销” 的解决办法
- python里面and和or用法
- 如何制作一个蓄力跳的功能
- 产品读书《长尾理论》
- Kubernetes(K8s)Events介绍(上)
- 为什么手机玩我的世界进服务器会显示红字,LOL进去时显示的蓝红标志是什么 | 手游网游页游攻略大全...
热门文章
- JAVA 双重检查锁定和延迟初始化
- 完全背包问题 POJ1384
- 半导体制冷器性能计算
- 函数要多小才够好——谈小函数之道
- Java web程序中备份oracle数据库
- Fedora 30可能默认启用DNF的best模式
- 微型计算机的外存储器可与 直接打交道,微型计算机的外存储器可与( )直接打交道。...
- oracle 根据分隔符提取,oracle根据分隔符获取字符串
- python 钉钉机器人自定义发送文件_Python自定义钉钉机器人发送自动化结果报告...
- 010_静态资源的配置和常用请求配置