Java Builder模式 体验(二)
Builder 模式,即建造者模式,顾名思义,这个模式可能更多的使用在产品的组装中使用,具体说就是在软件产品的组件或模块组装的时候使用。
感觉网络上比较好的解释有:
建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用的场景:
1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2、当构造过程必须允许被构造的对象有不同的表示时。
首先我们来说下,建造者模式中三个重要的角色:
1、Product (生产者):该角色其实类似于工厂里的流水线,它可以生产各种各样的组件,但是并不知道怎样将这些组件进行组装,进而产生出不同的产品。
2、Builder(建造者):该角色类似流水线上的操作工人,它负责将不同的流水线上生产出的不同零件或组件,按照(领导Director)特定要求组装成特定的产品,并给Director提供一个build方法,让其随时可以取走已经组装好的产品。
3、Director(指挥者或者领导):该角色主要根据不同客户的需求,调用不同的Builder对象来组装出特定的产品,提供给客户使用。
为了便于理解,我们假设还有第4个角色:
4、Client(客户): 客户是产品需求的来源,但是客户不会和生产线或工厂的操作工打交道,他们只会开着车,和领导打交道。
好了,各个角色,我们都定义好了,我们寻找一个场景吧。就拿汽车的生产来说事吧。
我们假设有以下场景:
Dirctor是生产CarX品牌汽车公司的领导,ClientA和ClientB是分别来自欧洲和亚洲的客户。ClientA希望买到的CarX汽车能够达到更好的节能和经济性需求,ClientB希望买到的车更好的满足安全性和舒适性。Dirctor根据2个客户的需求,命令工程师设计了2套流水线,2条流水线生产的产品都一样,但是产品的性能不同:
A生产线(ProductionLineA)主要生产小排量的发动机和配置不高的ABS安全系统;
B生产线(ProductionLineB)主要生产排量较大的发动机和配置较高的ABS安全系统;
同时为2条生产线安排了不同的组装工程师BuilderA和BuilderB。
产品的组装命令和验收由Dirctor统一负责。
好了,自此,任务分配完毕,我们开始编码工作了。
首先,对上面问题的分析,我们可以发现,A生产线和B生产线生产的东西名称和功能是一样的,只是性能不同,因此可以对生产线可以进行抽象。
- package com.icecode.demo;
- public abstract class AbstractProductionLine {
- //生产汽车发动机
- public abstract void createEngine();
- //生产汽车安全系统
- public abstract void createSecuritySystem();
- //生产汽车车身
- public abstract void createCarBody();
- }
同样,我们也可以对建造工程师也进行抽象,如下:
- package com.icecode.demo;
- public abstract class AbstractBuilder {
- //命令1:启动生产汽车零部件生产线命令
- public abstract void buildCarParts();
- //命令2:将命令1生产的零部件组装成完整的汽车
- public abstract AbstractProductionLine buildCar();
- }
好了,方案和任务都安排好了,我们开始具体实施了。
- package com.icecode.demo.impl;
- import com.icecode.demo.AbstractProductLine;
- /**
- * 流水线A
- * @author zhanche
- *
- */
- public class ConcreteProductLineA extends AbstractProductLine {
- @Override
- public void createEngine() {
- System.out.println("------------生产小排量发动机----------");
- }
- @Override
- public void createSecuritySystem() {
- System.out.println("----------生产普通标准的安全系统-----------");
- }
- @Override
- public void createCarBody() {
- System.out.println("----------生成汽车车身部件-----------");
- }
- }
- package com.icecode.demo.impl;
- import com.icecode.demo.AbstractProductLine;
- /**
- * 流水线B
- * @author zhanche
- *
- */
- public class ConcreteProductLineB extends AbstractProductLine {
- @Override
- public void createEngine() {
- System.out.println("------------生产标准排量的发动机----------");
- }
- @Override
- public void createSecuritySystem() {
- System.out.println("----------生产高标准的安全系统-----------");
- }
- @Override
- public void createCarBody() {
- System.out.println("----------生成汽车车身部件-----------");
- }
- }
- package com.icecode.demo.impl;
- import com.icecode.demo.AbstractBuilder;
- import com.icecode.demo.AbstractProductLine;
- /**
- * 建造工人A
- * @author zhanche
- *
- */
- public class ConcreteBuilderA extends AbstractBuilder {
- private AbstractProductLine productLineA = new ConcreteProductLineA();
- @Override
- public void buildCarParts() {
- productLineA.createEngine();
- productLineA.createSecuritySystem();
- productLineA.createCarBody();
- System.out.println("-----生产线A完成一辆汽车零部件的生产-----");
- }
- @Override
- public AbstractProductLine buildCar() {
- System.out.println("----------完成一辆汽车A的组装调试----------");
- return productLineA;
- }
- }
- package com.icecode.demo.impl;
- import com.icecode.demo.AbstractBuilder;
- import com.icecode.demo.AbstractProductLine;
- /**
- * 建造工人B
- * @author zhanche
- *
- */
- public class ConcreteBuilderB extends AbstractBuilder {
- private AbstractProductLine productLineB = new ConcreteProductLineB();
- @Override
- public void buildCarParts() {
- productLineB.createEngine();
- productLineB.createSecuritySystem();
- productLineB.createCarBody();
- System.out.println("-----生产线B完成一辆汽车零部件的生产----");
- }
- @Override
- public AbstractProductLine buildCar() {
- System.out.println("----------完成一辆汽车B的组装调试----------");
- return productLineB;
- }
- }
到此,我们的产品建造实施实体都安排好了,现在需要做的是实现Director(领导者)角色的功能,他负责下发开始启动生产零部件的命令和开始组装的命令。
- package com.icecode.demo.director;
- import com.icecode.demo.AbstractBuilder;
- import com.icecode.demo.AbstractProductLine;
- import com.icecode.demo.impl.ConcreteBuilderA;
- import com.icecode.demo.impl.ConcreteBuilderB;
- public class Director {
- private AbstractBuilder builderA = new ConcreteBuilderA();
- private AbstractBuilder builderB = new ConcreteBuilderB();
- public AbstractProductLine getProductA() {
- builderA.buildCarParts();
- //还可以增加对产品质量抽检等功能
- return builderA.buildCar();
- }
- public AbstractProductLine getProductB(){
- builderB.buildCarParts();
- //还可以增加对产品质量抽检等功能
- return builderB.buildCar();
- }
- }
领导的任务和职责也安排好了,现在2个客户ClientA和ClientB来和Director签订合同,CarX工厂开始完成客户的任务。代码如下:
- package com.icecode.demo.client;
- import com.icecode.demo.director.Director;
- /**
- * 客户A
- * @author zhanche
- *
- */
- public class ClientA {
- /**
- * @param args
- */
- public static void main(String[] args) {
- System.out.println("ClientA 完成与Director生产汽车A的合同");
- Director director = new Director();
- director.getProductA();
- }
- }
- package com.icecode.demo.client;
- import com.icecode.demo.director.Director;
- /**
- * 客户B
- * @author zhanche
- *
- */
- public class ClientB {
- /**
- * @param args
- */
- public static void main(String[] args) {
- System.out.println("ClientB 完成与Director生产汽车A的合同");
- Director director = new Director();
- director.getProductB();
- }
- }
运行ClientA输出如下结果:
ClientA 完成与Director生产汽车A的合同
------------生产小排量发动机----------
----------生产普通标准的安全系统-----------
----------生成汽车车身部件-----------
----生产线A完成一辆汽车零部件的生产------
----------完成一辆汽车A的组装调试----------
运行ClientB输出如下结果:
ClientB 完成与Director生产汽车A的合同
------------生产标准排量的发动机----------
----------生产高标准的安全系统-----------
----------生成汽车车身部件-----------
-----生产线B完成一辆汽车零部件的生产----
----------完成一辆汽车B的组装调试----------
到此为止,我们的一个建造者模式的应用实例已经完成了。当然,对生产线和建造者的抽象还可以使用接口来实现,原理都是一样的。
有人总结说Builder模式其实综合了模板方法和工厂模式的思想,其实的确可以这么理解,只是建造者模式对工厂化的生产过程和参与者的角色,做了进一步的细化。大家可以根据不同的需求,选择不同的设计模式。
Java Builder模式 体验(二)的更多相关文章
- Java Builder 模式,你搞懂了么?
加油.png 前言:最近闲来无事的时候想着看看一些平常用的三方库源码,没想到看了之后才知道直接撸源码好伤身体,一般设计优秀的开源库都会涉及很多的设计模式,就比如 android 开发使用频繁的 okH ...
- Java设计模式--Java Builder模式
1.Java Builder模式主要是用一个内部类去实例化一个对象,避免一个类出现过多构造函数,而且构造函数如果出现默认参数的话,很容易出错. public Person(String name) P ...
- JAVA Builder模式构建MAP/LIST的示例
我们在构建一个MAP时,要不停的调用put,有时候看着觉得很麻烦,刚好,看了下builder模式,觉得这思路不错,于是乎,照着用builder模式写了一个构建MAP的示例,代码如下: import j ...
- Java Builder 模式,你搞明白了么?
Builder 模式定义 Builder 模式中文叫作建造者模式,又叫生成器模式,它属于对象创建型模式,是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.建造者模式是一步一步 ...
- Java多线程模式(二)
Guarded Suspension Pattern 该模式描述的是当一个线程在执行某个操作时,但由于其他资源还没有准备好,需要等待,那么就等待资源准备好才开始自己的操作.我们直接看代码例子 ...
- Java 代理模式(二) Java中的动态代理
动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类: 1.Interface InvocationHandler 该接口中仅定义了一个方法: Objec ...
- Java 代理模式 (二) 动态代理
代理模式 代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式:即通过代理访问目标对象. 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作.(扩展目标对象的功能). 代理模式的 ...
- java Builder模式创建不可变类
package com.geostar.gfstack.operationcenter.logger.manager.common; /** * Created by Nihaorz on 2017/ ...
- java - Builder模式实例化对象
Builder 优雅的链式调用来实现实例化对象 1. 首先在实体类中,构造一个Builder内部类,由Builder来完成Person的属性赋值,并最终执行build来完成Person的实例化 pa ...
随机推荐
- 小学生之手(01)之 "for循环"
---恢复内容开始--- 咳咳咳!第一次要写这种东西,要是有不足的地方,请见谅!!!并且感觉在这班门弄斧是不是有点托大了.一向擅长低调的我,在’被逼无奈‘之下,要嚣张一下了......(此处省略500 ...
- 手动向IIS注册.net框架组件
安装.NET Framework时,会自动在IIS上注册ASP.NET,如果已经存在.NET Framework再安装的IIS,必须告诉IIS已经存在framework. 有时IIS功能缺失或异常 ...
- Oracle除去换行符的方法
Oracle除去换行符的方法 很多数据存进数据库后,可能需要将整条数据取出,并用特殊 符号分割,而且整条数据必须是处于一行,如此,如果数据出现 换行的情况,那么读取时就有问题. 这个时候就 ...
- EasyUi DataGrid中数据编辑方式及编辑后数据获取,校验处理
EasyUi中的DataGrid提供前台编辑的相关函数. 实现客户选中DataGrid中一列后,对选中列中的一个字段进行编辑,并对数据进行实时校验后,传递至后台保存的需求, 主要涉及到DataGrid ...
- 状态压缩dp zoj3802
做这个题的时候看了看时间复杂度觉得应该是个贪心或者dp,然后贪心又很快被否定了,因为不具备贪心的一些特性,想了想觉得没什么思路.看了下网上的思路,真是让人拍案叫绝,算法的魅力就在于此啊.. 首先dp就 ...
- Dijkstra算法 最短路径 (部分)
void Dijkstra(int n, int v, int *dist, int *prev, int c[maxnum][maxnum]) { bool s[maxnum]; ...
- Visual Studio的广告剧
一个热衷于code的developer,一个热衷于developer的girl,他们将发生怎样的故事? 第一集:<想做你的Code> 第二集:<让爱延长> 第三集:<幸福 ...
- jQuery Lazy Load 图片延迟加载
基于 jQuery 的图片延迟加载插件,在用户滚动页面到图片之后才进行加载. 对于有较多的图片的网页,使用图片延迟加载,能有效的提高页面加载速度. 版本: jQuery v1.4.4+ jQuery ...
- Lua 学习笔记(二)
七.再论lua函数 1.lua中的函数被认为是带有词法定界和第一类值 a.词法定界:被嵌套的函数可以访问外部函数的变量 b.第一类值: lua中的函数可以放在变量中 (函数指针?) ...
- Spark link集合
Part1. 各种参数的意义及如何配置 Spark官方文档——Spark Configuration(Spark配置) http://www.cnblogs.com/vincent-hv/p/3316 ...