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 ...
随机推荐
- sublime text3中的常用插件
1.All Autocomplete Sublime Text 默认的 Autocomplete 功能只考虑当前的文件,而 AllAutocomplete 插件会搜索所有打开的文件来寻找匹配的提示词. ...
- MySql多条SQL语句的批量处理
pstmt= conn.prepareStatement(sql); for(int i=0;i<500;i++) { //准备sql语句 pstmt.setString(1, "tt ...
- UVA 10037 贪心算法
题目链接:http://acm.hust.edu.cn/vjudge/contest/122829#problem/A 题目大意:N个人夜里过河,总共只有一盏灯,每次最多过两个人,然后需要有人将灯送回 ...
- 分享一个js生成二维码的库
二维码用js生成会比用服务器生成方便很多,只要把window.location.href的值传入,即可生成对应的二维码..最主要是,这个库可以兼容ie6~ie9哦... 具体使用,请看官网:http: ...
- C程序设计语言练习题1-2
练习1-2 做个实验,当printf函数的参数字符串中包含\c(其中c是上面的转义字符串序列中未曾列出的某一个字符)时,观察一下会出现什么情况. 代码如下: #include <stdio.h& ...
- ARM 汇编器对C的扩展
__swi void ledtest(); //:声明 edtest 是个软中断. __asm 内嵌汇编 //:通常在C程序里面需要嵌入汇编代码,这是就可以用__asm关键字 ...
- Spring学习笔记--依赖注入
依赖注入和控制反转:http://baitai.iteye.com/blog/792980出自李刚<轻量级 Java EE 企业应用实战> Java应用是一种典型的依赖型应用,它就是由一些 ...
- JNI学习&使用过程中的错误
Part 1 Ubuntu下JNI的简单使用: http://blog.csdn.net/fengqiaoyebo2008/article/details/6210499 Part 2 在eclips ...
- GCD 单例
+ (ThemeManager *)sharedInstance { static dispatch_once_t once; //只执行一次 static ThemeManager ...
- Codeforces 219D Choosing Capital for Treeland
http://codeforces.com/problemset/problem/219/D 题目大意: 给出一棵树,但是它的边是有向边,选择一个城市,问最少调整多少条边的方向能使一个选中城市可以到达 ...