生成器模式是创建型设计模式。

设计意图:将一个复杂的类表示与其构造相分离,使得同样的构建过程可以得出不同的表示。

实例类图:

IVehicleBuilder:抽象建造者。为创建一个Vehicle对象并创建它的相关部件指定的抽象接口,把产品的生产过程分解为不同的步骤,从而使详细的建造者在详细的建造步骤上具有很多其它弹性,从而创造出不同表示的产品。(这里就是小车和卡车)

CarBuilder、TrunkBuilder:详细建造者,实现IVehicleBuilder接口,构造和装配产品的各个部件定义并明白它所创建的表示,提供一个返回这个产品的接口。

Director:指挥者,构建一个使用IVehicleBuilder接口的对象。

Vehicle:汽车产品,被构建的复杂对象,详细产品建造者,创建该产品的内部表示并定义它的装配过程。

我们先看一下Director都做了什么!

package com.builder;

import com.factory.abstrcatfactory.model.Engine;
import com.factory.abstrcatfactory.model.Tank;
import com.factory.abstrcatfactory.model.Vehicle; /**构建器的指挥者
* 构建器模式能够构建同样步骤的两个系列商品
* 在构建同样步骤的系列商品上,代码量上要优于抽象工厂模式,可是每一个产品的不同步骤产品的添加时抽象工厂更有优势,由于功能类隔离性更好。
* @author gaoxu
* 实践出真知! */
public class Director {
private IVehicleBuilder _vehicleBuilder = null; public Director(IVehicleBuilder vehicleBuilder){
_vehicleBuilder = vehicleBuilder;
} public Vehicle createVehicle(){
Engine engine = _vehicleBuilder.builderEngine();
Tank tank = _vehicleBuilder.builderTank();
Vehicle vehicle = _vehicleBuilder.builderVehicle(engine,tank);
return vehicle;
}
}

我们看到指挥者负责指挥建造产品,再来看一下client的代码。我们就清楚指挥者有多重要了,生成器模式必须有指挥者。

package com.builder;

import com.factory.abstrcatfactory.model.Vehicle;

/**
* @author gaoxu
* 实践出真知! */
public class Client {
public static void main(String[] para){
//小车
IVehicleBuilder carBuilder = new CarBuilder();
Director director = new Director(carBuilder);
Vehicle car = director.createVehicle();
//卡车
IVehicleBuilder trunkBuilder = new TrunkBuilder();
Director directorT = new Director(trunkBuilder);
Vehicle trunk = directorT.createVehicle();
}
}

我们再来看详细构建者的代码。我们就清楚了。每一个详细构建器都是一个产品的构建总体过程的详细实现。

小车详细构建者,构建发动机、构建油箱。构建小车。

这些都封装在详细的构建器中,这样构建与表示就显示的分离,显示在client端没有不论什么详细构建者内容的影子,全然封装了起来。

package com.builder;

import com.factory.abstrcatfactory.model.Engine;
import com.factory.abstrcatfactory.model.Tank;
import com.factory.abstrcatfactory.model.Vehicle; /**小车详细实现类
* @author gaoxu
* 实践出真知!
*/
public class CarBuilder implements IVehicleBuilder { @Override
public Engine builderEngine() {
// TODO Auto-generated method stub
return null;
} @Override
public Tank builderTank() {
// TODO Auto-generated method stub
return null;
} @Override
public Vehicle builderVehicle(Engine engine,Tank tank) {
// TODO Auto-generated method stub
return null;
} }
package com.builder;

import com.factory.abstrcatfactory.model.Engine;
import com.factory.abstrcatfactory.model.Tank;
import com.factory.abstrcatfactory.model.Vehicle; /**卡车详细实现类
* @author gaoxu
* 实践出真知! */
public class TrunkBuilder implements IVehicleBuilder { @Override
public Engine builderEngine() {
// TODO Auto-generated method stub
return null;
} @Override
public Tank builderTank() {
// TODO Auto-generated method stub
return null;
} @Override
public Vehicle builderVehicle(Engine engine,Tank tank) {
// TODO Auto-generated method stub
return null;
} }

上边的实例也是创建汽车。我们能够看到相同是创建汽车,生成器模式要比抽象工厂模式的代码量少非常多非常多,当然在解耦方面还是抽象工厂更好一些,由于生成器中的详细构建器中有全部的产品部件的构建过程。假设这个过程更复杂那么详细构建器将非常庞大,改动起来错误率也会非常高。而抽象工厂在这方面还是比較好的,每一个部件都是独立的构建接口与类。

跟着实例学习设计模式(6)-生成器模式builder(创建型)的更多相关文章

  1. 设计模式03: Builder 生成器模式(创建型模式)

    Builder生成器模式(创建型模式) Builder模式缘起假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各个部分富于变化.如果使用最直观的设计方法,每个房屋部分的变化,都将 ...

  2. 设计模式十: 生成器模式(Builder Pattern)

    简介 生成器模式属于创建型模式的一种, 又叫建造者模式. 生成器模式涉及4个关键角色:产品(Product),抽象生成器(builder),具体生成器(ConcreteBuilder),指挥者(Dir ...

  3. 【设计模式】- 生成器模式(Builder)

    生成器模式 建造者模式.Builder 生成器模式 也叫建造者模式,可以理解成可以分步骤创建一个复杂的对象.在该模式中允许你使用相同的创建代码生成不同类型和形式的对象. 生成器的结构模式 生成器(Bu ...

  4. Java设计模式05:常用设计模式之原型模式(创建型模式)

    1. Java之原型模式(Prototype Pattern)     原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. ...

  5. Java设计模式02:常用设计模式之工厂模式(创建型模式)

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的.  工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Fact ...

  6. Java设计模式04:常用设计模式之建造者模式(创建型模式)

    1. Java之建造者模式(Builder Pattern) (1)概念:       将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. [ 构建与表示分离, 同构建不同表示 ] ...

  7. 跟着实例学习设计模式(7)-原型模式prototype(创建型)

    原型模式是创建型模式. 设计意图:用原型实例指定创建对象的类型,并通过拷贝这个原型来创建新的对象. 我们使用构建简历的样例的类图来说明原型模式. 类图: 原型模式主要用于对象的复制.它的核心是就是类图 ...

  8. 每天一个设计模式-7 生成器模式(Builder)

    每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...

  9. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

随机推荐

  1. XPath语法 在C#中使用XPath例子与用法

    XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识.示例Xml: <?xml version="1.0" enc ...

  2. 【linux】进程存储管理

    看<Linux高级程序设计>的笔记 设有一个hello的可执行文件 ①显示该文件的基本信息 ls hello -l ②文件基本情况 file hello ③列出文件的存储区域情况 size ...

  3. unittest框架及自动化测试

    之前在公司做过自动化测试的知识分享,现在把它记录下来.   •一.如何更好的编写测试用例 •1.模块化:将一些基础的.共有的步骤代码独立为单独的模块,使用时再调用.好处:可以使代码复用,减少代码编写, ...

  4. hdu 1573(中国剩余定理)

    X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. python 设计模式之门面模式

    facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单接口的对象,就像类库.   门面模式被归入建筑设计模式.门面模式隐藏系统内部的细 ...

  6. Topcoder SRM 663 DIV 1

    ABBADiv1 题意: 规定两种操作,一种是在字符串的末尾添加A,另一种是在末尾添加B然后反转字符串.现在给你一个起始串,一个终点串,然后问你是否能够通过以上两种操作,从起始串变为终点串. 题解: ...

  7. [CF665F]Four Divisors

    题目大意: 给定$n(n\leq10^{11})$,求$\displaystyle\sum_{i=1}^n[\tau(i)=4]$. 思路: 设$p,q$为不相等的质数,则满足$\tau(i)=4$的 ...

  8. 基于WPF系统框架设计(3)-Fluent Ribbon界面布局

    一个系统框架除了功能菜单导航,有系统内容显示区域,系统状态栏. Silver: Blue: Black: 系统界面设计,就不进行技术细节介绍了,主题以框架设计为主,Xaml源码参考: <Flue ...

  9. centos中httpd Server not started: (13)Permission denied: make_sock: could not bind to address [::]:8888

    Install semanage tools: sudo yum -y install policycoreutils-python Allow port 88 for httpd: sudo sem ...

  10. 深入浅出 Cocoa 之 Core Data(4)- 使用绑定

    深入浅出 Cocoa 之 Core Data(4)- 使用绑定 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 前面讲解了 Core Data 的框架, ...