初识Java设计模式之Builder
2016-03-22 10:54
525 查看
定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builder 模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类
型和内容就可以构建它们.用户不知道内部的具体构建细节.Builder模式是非常类似抽象
工厂模式,细微的区别大概只有在反复使用中才能体会到.
为何使用?
是为了将构建复杂对象的 过程 和它的 部件 解耦.注意: 是解耦 过程 和 部件 .
因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮 方向盘 发动机
还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配
过程也很复杂(需要很好的组装技术),Builder 模式就是为了将部件和组装过程分开.
如何使用?
首先假设一个复杂对象是由多个部件组成的,Builder 模式是把复杂对象的创建和部件的
创建分别开来,分别用 Builder 类和 Director 类来表示.
首先,需要一个接口,它定义如何创建复杂对象的各个部件:
用 Director 构建最后的复杂对象,而在上面 Builder 接口中封装的是如何创建一个个部
件(复杂对象是由这些部件组成的),也就是说 Director 的内容是如何将部件最后组装成
成品:
Builder 的具体实现 ConcreteBuilder:通过具体完成接口 Builder 来构建或装配产品的部件;定义并明确它所要创建的是什么具体东西;提供一个可以重新获取产品的接口:
复杂对象的部件:
我们看看如何调用 Builder 模式:
分析总结
效果:
1 隐藏产品的内部表示
Builder提供创建产品的接口给Director,
隐藏了产品的内部结构(仅提供接口BuildPart()创建产品)
隐藏该产品是如何装配的(BuildPart()内部装配是隐藏的)。
2 将构造代码和表示代码分开
构造代码是在Builder提供的接口中完成的,每个ConcreateBuilder包含了创建和装配一个特定产品的所有代码。
提供不同的Builder,使用相同的Director导向过程可以得到不同的表示。
使用的不同Client可以使用相同的Builder,得到不同相同的表示。
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Builder 模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类
型和内容就可以构建它们.用户不知道内部的具体构建细节.Builder模式是非常类似抽象
工厂模式,细微的区别大概只有在反复使用中才能体会到.
为何使用?
是为了将构建复杂对象的 过程 和它的 部件 解耦.注意: 是解耦 过程 和 部件 .
因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮 方向盘 发动机
还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配
过程也很复杂(需要很好的组装技术),Builder 模式就是为了将部件和组装过程分开.
如何使用?
首先假设一个复杂对象是由多个部件组成的,Builder 模式是把复杂对象的创建和部件的
创建分别开来,分别用 Builder 类和 Director 类来表示.
首先,需要一个接口,它定义如何创建复杂对象的各个部件:
public interface Builder { //创建部件 A 比如创建汽车车轮 void buildPartA(); //创建部件 B 比如创建汽车方向盘 void buildPartB(); //创建部件 C 比如创建汽车发动机 void buildPartC(); //返回最后组装成品结果 (返回最后装配好的汽车) //成品的组装过程不在这里进行,而是转移到下面的 Director 类 中进行. //从而实现了解耦 过程 和 部件 Product getResult(); }
用 Director 构建最后的复杂对象,而在上面 Builder 接口中封装的是如何创建一个个部
件(复杂对象是由这些部件组成的),也就是说 Director 的内容是如何将部件最后组装成
成品:
public class Director { private Builder builder; public Director( Builder builder ) { this.builder = builder; } // 将部件 partA partB partC 最后组成复杂对象 //这里是将车轮 方向盘和发动机组装成汽车的过程 public void construct() { builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); } }
Builder 的具体实现 ConcreteBuilder:通过具体完成接口 Builder 来构建或装配产品的部件;定义并明确它所要创建的是什么具体东西;提供一个可以重新获取产品的接口:
public class ConcreteBuilder implements Builder { Part partA, partB, partC; public void buildPartA() { //这里是具体如何构建 partA 的代码 }; public void buildPartB() { //这里是具体如何构建 partB 的代码 }; public void buildPartC() { //这里是具体如何构建 partB 的代码 }; public Product getResult() { //返回最后组装成品结果 }; }复杂对象:产品 Product:
public interface Product { }
复杂对象的部件:
public interface Part { }
我们看看如何调用 Builder 模式:
ConcreteBuilder builder = new ConcreteBuilder(); Director director = new Director( builder ); director.construct(); Product product = builder.getResult();
分析总结
效果:
1 隐藏产品的内部表示
Builder提供创建产品的接口给Director,
隐藏了产品的内部结构(仅提供接口BuildPart()创建产品)
隐藏该产品是如何装配的(BuildPart()内部装配是隐藏的)。
2 将构造代码和表示代码分开
构造代码是在Builder提供的接口中完成的,每个ConcreateBuilder包含了创建和装配一个特定产品的所有代码。
提供不同的Builder,使用相同的Director导向过程可以得到不同的表示。
使用的不同Client可以使用相同的Builder,得到不同相同的表示。
相关文章推荐
- 用户体验设置和UI设计的10个不同点
- 307. Range Sum Query - Mutable
- seueuQgnisukcatStnemelpmI.225
- how to write order by and limit query in jpa [duplicate]
- Android自动化测试(UiAutomator)简要介绍 - 萧瑟一笑的专栏 - 博客频道 - CSDN.NET
- Crank Storyboard Suite入门(一)
- 【LeetCode】60. Permutation Sequence
- 304. Range Sum Query 2D - Immutable
- 对iOS 9 新增的控件 UIStackView 官方文档的翻译 第四部分
- 187. Repeated DNA Sequences
- 60. Permutation Sequence
- 手机GUI自动化测试介绍 | 有道技术沙龙博客
- C#中怎么生成36位的GUID
- UIViewContentMode各类型效果
- iOS开发~UITableViewCell重用机制总结
- android UI进阶之实现listview的分页加载
- libraries for bitcode must be generated from Xcode Archive or Install build forARM7 解决办法
- DelayQueue 队列
- 《iOS Human Interface Guidelines》——Contact Add Button
- UIStepper