创建者模式:

分离对象子组件的单独构造(由Builder来负责)和装配(由Director负责),对象的构造比较复杂时使用 该模式。

类图:

Builder 抽象建造者接口,规范各个组成部分的构建。

  ConcreteBuilder 具体建造者角色,实现组成部分的构建,并提供示例。

  Product 产品角色,创建返回的对象。

  Director 导演者角色,负责创建以及使用。

优点:

由于实现了构建和装配的解耦。不同的构建器,相同的装配也可以做成不同的对象,相同的构建器,不同的装配顺序也可以生产成不同的对象。也就是实现了构造算法和装配算法的解耦,实现了更好的复用。

应用场景:

StringBuilder类的append方法。

SQL中的PreparedStatement

JDOM中,DomBuilder SAXBuilder

创建者模式Demo

 package builder.domain;

 /**
* 宇宙飞船
*
*/
public class AirShip {
private OrbitalModule orbitalModule; //轨道舱
private Engine engine; //发动机
private EscapeTower escapeTower; //逃逸塔 public void launch(){
System.out.println("发射!");
} public OrbitalModule getOrbitalModule() {
return orbitalModule;
} public void setOrbitalModule(OrbitalModule orbitalModule) {
this.orbitalModule = orbitalModule;
} public Engine getEngine() {
return engine;
} public void setEngine(Engine engine) {
this.engine = engine;
} public EscapeTower getEscapeTower() {
return escapeTower;
} public void setEscapeTower(EscapeTower escapeTower) {
this.escapeTower = escapeTower;
}
} package builder.domain; public class Engine {
private String name; public Engine(String name) {
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
} package builder.domain; public class EscapeTower {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public EscapeTower(String name) {
super();
this.name = name;
}
} package builder.domain; public class OrbitalModule {
private String name; public OrbitalModule(String name)
{
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} } package builder.service; import builder.domain.Engine;
import builder.domain.EscapeTower;
import builder.domain.OrbitalModule; public interface IAirShipBuilder {
Engine builderEngine();
OrbitalModule builderOrbitalModule();
EscapeTower builderEscapeTower();
} package builder.service; import builder.domain.Engine;
import builder.domain.EscapeTower;
import builder.domain.OrbitalModule; public class AirShipBuilderImpl implements IAirShipBuilder {
//StringBuilder, 以后学习XML解析中,JDOM库中的类:DomBuilder,SaxBuilder
@Override
public Engine builderEngine() {
// TODO Auto-generated method stub
System.out.println("构建发动机!");
return new Engine("发动机!");
} @Override
public OrbitalModule builderOrbitalModule() {
// TODO Auto-generated method stub
System.out.println("构建轨道舱");
return new OrbitalModule("轨道舱");
} @Override
public EscapeTower builderEscapeTower() {
// TODO Auto-generated method stub
System.out.println("构建逃逸塔");
return new EscapeTower("逃逸塔");
} } package builder; import builder.domain.AirShip; public interface IAirShipDirector {
/**
* 组装飞船对象
* @return
*/
AirShip directAirShip();
} package builder; import builder.domain.AirShip;
import builder.domain.Engine;
import builder.domain.EscapeTower;
import builder.domain.OrbitalModule;
import builder.service.IAirShipBuilder; public class AirshipDirectorImpl implements IAirShipDirector {
private IAirShipBuilder builder; public AirshipDirectorImpl(IAirShipBuilder builder) {
this.builder = builder;
} @Override
public AirShip directAirShip() {
// TODO Auto-generated method stub
Engine e = builder.builderEngine();
OrbitalModule o = builder.builderOrbitalModule();
EscapeTower et = builder.builderEscapeTower(); //装配成飞船对象
AirShip ship = new AirShip();
ship.setEngine(e);
ship.setEscapeTower(et);
ship.setOrbitalModule(o); return ship;
} } package builder; import builder.domain.AirShip;
import builder.service.AirShipBuilderImpl; public class Client { public static void main(String[] args) {
// TODO Auto-generated method stub
IAirShipDirector director = new AirshipDirectorImpl(new AirShipBuilderImpl()); AirShip ship = director.directAirShip(); System.out.println(ship.getEngine().getName()); ship.launch();
} }

创建者模式Builder的更多相关文章

  1. [设计模式] 3 创建者模式 builder

    转载http://blog.csdn.net/wuzhekai1985/article/details/6667467 建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不 ...

  2. 设计模式学习总结(五)创建者模式(Builder)

    创建者模式,主要针对某些产品有类似的生产步骤,且有需要有先后顺序的进行各个部件的生成. 一.示例展示: 通过学习及总结,以下是我完成的创建者模式的示例: 1.创建产品类:Laptop public c ...

  3. 创建者模式-Builder

    创建者模式使用多个简单的对象一步一步构建成一个复杂的对象.它提供了一种创建对象的最佳方式.一个 Builder 类会一步一步构造最终的对象,该 Builder 类是独立于其他对象的. 一.类图 创建者 ...

  4. 【设计模式】—— 创建者模式Builder

    前言:[模式总览]——————————by xingoo 模式意图 一个对象的创建十分复杂,为了区分构建过程和使用过程,因此分开.使用一个Director类进行对象的创建,Builder规定了这个创建 ...

  5. (Builder)创建者模式

    定义: 建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示. 适用性: 当流程算法可以固定几个步骤,步骤的算法步骤执行顺序固定,且制造的产品可以唯一确定,这时使用创建 ...

  6. Builder创建者模式

    http://www.codeproject.com/Articles/42415/Builder-Design-Pattern In Elizabeth's day care center, the ...

  7. 创建类模式(三):创建者(Builder)

    定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.这使得构件算法和组装方式可以独立应对变化:复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式 ...

  8. C#设计模式之五创建者模式(Builder)【创建型】

    一.引言  今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一个复杂的物品,它主要是由CPU.主板.硬 ...

  9. OOAD(面向对象分析和设计)GRASP之创建者模式(Creator)又称生成器模式学习笔记

    说OOAD是一门玄学,一点都不为过.又或许是因为我之前一直没有很好的建立面向对象的思想,更有可能是因为练得不够多...总之,一直没能很好理解,哪怕把一本叫做<UML和模式应用>的书翻来覆去 ...

随机推荐

  1. win7取消任务栏预览并显示文件名

    开始--运行--regedit--回车,然后注册表就打开了,之后开始找到如下的位置,新增2个项 HKEY_CURRENT_USER\Software\Microsoft\Windows\Current ...

  2. 王立平-- android:layout_weight

    效果: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQyNTUyNw==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  3. struct、union、enum and sizeof

    struct 1.结构体和数组的差别:能够再结构体里声明数组.结构体变量能够相互赋值.而数组不行. 2.struct与class的差别:class的成员訪问权限默认是private,而struct成员 ...

  4. PHP高级教程-邮件

    PHP 发送电子邮件 PHP 允许您从脚本直接发送电子邮件. PHP mail() 函数 PHP mail() 函数用于从脚本中发送电子邮件. 语法 mail(to,subject,message,h ...

  5. Yahoo团队总结的关于网站性能优化的经验(转)

    英文原文:http://developer.yahoo.com/performance/rules.html 中文原文:http://www.ha97.com/2710.html 1.尽量减少HTTP ...

  6. Emmet初探2

    关于Emmet Emmet插件的前身是Zen coding,可以大幅度提高前端开发效率的一个工具,也有人说类似于jade(高性能的模板引擎,它深受 Haml 影响,它是用 JavaScript 实现的 ...

  7. OpenERP 在context中写自己的部门ID

    使用OpenERP自定义模块开发的时候,你会发现,有一个uid(当前登录用户id)特别好用,不管是在xml的domain 条件表达式中,还是在类中,都能很方便的使用uid.有一段时间就一直在琢磨,这个 ...

  8. 在webBrowser1.Navigate(url)中设置Cookie的注意点

    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] public static exte ...

  9. oracle 批量更新表字段

      (一) 将数字替换成汉字 第一步,去重查询 使用distinct关键字先对该字段值进行去重查询,看共有几种情况 --查询指定区间内表停诊字段的值 SELECT DISTINCT T.CLOSE_T ...

  10. EXCEPTION-IBATIS

      CreateTime--2016年8月23日08:44:03Author:Marydonibatis的sqlMap的xml文件配置出现的异常信息及解决方案 声明:异常类文章主要是记录了我遇到的异常 ...