• 定义:

  建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。

  • 适用性:

当流程算法可以固定几个步骤,步骤的算法步骤执行顺序固定,且制造的产品可以唯一确定,这时使用创建者模式。

  • 模式思想:

对算法步骤进行封装(Director),对流程算法步骤有统一的接口Builder,算法具体的每个步骤变化时,可以通过实现算法步骤借口类进行扩展或适配(ConcreteBuilder1,ConcreteBuilder2…),Director不关心流程步骤,只负责流程算法执行顺序,从而达到了解耦,依赖倒置的思想。

  • 模式结构图:

  • 示例:

  Builder:

  1. 1 /// <summary>
  2. 2 /// Description of ValidateCodeBuilderBase.
  3. 3 /// </summary>
  4. 4 public abstract class ValidateCodeBuilderBase
  5. 5 {
  6. 6 protected ValidateCodeInfo ValidateCodeInfo=new ValidateCodeInfo();
  7. 7
  8. 8 //生成随机数
  9. 9 public abstract void CreateRandom();
  10. 10
  11. 11 //绘制验证码图片
  12. 12 public abstract void CreateImageBmp();
  13. 13
  14. 14 //混淆验证码图片
  15. 15 public abstract void DisposeImageBmp();
  16. 16
  17. 17 // 存放到session中
  18. 18 public abstract void SetSession();
  19. 19
  20. 20 /// <summary>
  21. 21 /// 返回生成的验证码信息
  22. 22 /// </summary>
  23. 23 public abstract ValidateCodeInfo GetResult();
  24. 24 }

  Director:

  1. 1 public class ValidateCodeDirector
  2. 2 {
  3. 3 private ValidateCodeBuilderBase builder=null;
  4. 4
  5. 5 public ValidateCodeDirector(ValidateCodeBuilderBase builder)
  6. 6 {
  7. 7 this.builder=builder;
  8. 8 }
  9. 9
  10. 10 public ValidateCodeInfo MakeValidateCode()
  11. 11 {
  12. 12 this.builder.CreateRandom();
  13. 13 this.builder.CreateImageBmp();
  14. 14 this.builder.DisposeImageBmp();
  15. 15 this.builder.SetSession();
  16. 16
  17. 17 return this.builder.GetResult();
  18. 18 }
  19. 19 }

  Product:

  1. 1 public class ValidateCodeInfo
  2. 2 {
  3. 3 public Bitmap Bitmap{get;set;}
  4. 4
  5. 5 public string ValidateCode{get;set;}
  6. 6 }

  ConcreteBuilder1:

  1. 1 public class ValidateCode_Style01:ValidateCodeBuilderBase
  2. 2 {
  3. 3 public override void CreateRandom()
  4. 4 {
  5. 5 //
  6. 6 }
  7. 7
  8. 8 public override void CreateImageBmp()
  9. 9 {
  10. 10 //
  11. 11 }
  12. 12
  13. 13 public override void DisposeImageBmp()
  14. 14 {
  15. 15 //
  16. 16 }
  17. 17
  18. 18 public override void SetSession()
  19. 19 {
  20. 20 //
  21. 21 }
  22. 22
  23. 23 public override ValidateCodeInfo GetResult()
  24. 24 {
  25. 25 return base.ValidateCodeInfo;
  26. 26 }
  27. 27 }

  ConcreteBuilder2:

  1. 1 public class ValidateCode_Style02:ValidateCodeBuilderBase
  2. 2 {
  3. 3 public override void CreateRandom()
  4. 4 {
  5. 5 //
  6. 6 }
  7. 7
  8. 8 public override void CreateImageBmp()
  9. 9 {
  10. 10 //
  11. 11 }
  12. 12
  13. 13 public override void DisposeImageBmp()
  14. 14 {
  15. 15 //
  16. 16 }
  17. 17
  18. 18 public override void SetSession()
  19. 19 {
  20. 20 //
  21. 21 }
  22. 22
  23. 23 public override ValidateCodeInfo GetResult()
  24. 24 {
  25. 25 return base.ValidateCodeInfo;
  26. 26 }
  27. 27 }
  • 各自职责

Builder:

流程算法抽象类,负责定义流程算法具体每个步骤的函数;

ConcreteBuilder:

实现流程每个步骤的具体实现类,必须遵循流程算法抽象接口(实现Builder抽象类);

Product:

按照一定的顺序执行完流程算法各个步骤后,在流程算法抽象类中将会提供一个GetResult()函数返回制造的产品就为Product.

Director:

用来确定流程算法步骤,并返回制造的产品。

  •  各自特点

Director特点:

    1. 结合Builder从而实现了解耦和依赖倒置;
    2. 对算法步骤进行封装;
    3. Director不关心流程步骤,只负责流程算法执行顺序,职责单一.

Builder特点:

1. 负责算法流程具体步骤的定义,具有总结能力,具有规范(模范)意义;

2. 不负责具体实现,从而结合Director达到解耦,依赖倒置。

  • 调用:

这里我必须要附上,它的调用要注意,实例化的ConcreteBuilder时Client来负责的,这也正体现了Director解耦的实现,Director只接收一个抽象的Builder对象。

  1. static void Main(string[] args)
  2. {
  3. // 实例化builder
  4. ValidateCodeBuilderBase builder=new ValidateCode_Style01();
  5. // 实例化director
  6. ValidateCodeDirector director=new ValidateCodeDirector(builder);
  7. // 生成验证码信息
  8. ValidateCodeInfo validateInfo=director.MakeValidateCode();
  9. }
  • 比较(抽象工厂vs创建者模式):

看起来很抽象工厂优点相似,不错,他们有相似指出就是都有类的实例化,但不同的的是,他们负责的重点不一样:

抽象工厂负责重点   :注重类的创建,类的实例化是交给了工厂方法实例化, 它负责了类的实例化------子类的创建封装在工厂方法中;

创建者模式负责重点:注重流程算法的操作步骤(Director),而Builder的子类(ConcreteBuilder)的实例化时由Client来实现的。

从这些方面来说我们可以说他们共同拥有创建型模式相似外,还有很大的区别,而且抽象工厂,创建的产品是多个系列的产品,而创建者确实一个确定的产品对象。

参考文档:《 http://www.codeproject.com/Articles/28309/Design-pattern-FAQ-Part-1-Training

希望牛人们,给点指点和建议!

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

  1. Builder创建者模式

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

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

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

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

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

  4. 创建者模式Builder

    创建者模式: 分离对象子组件的单独构造(由Builder来负责)和装配(由Director负责),对象的构造比较复杂时使用 该模式. 类图: Builder 抽象建造者接口,规范各个组成部分的构建. ...

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

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

  6. 创建者模式-Builder

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

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

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

  8. 【java设计模式】之 建造者(Builder)模式

    我们还是举上一节的例子:生产汽车.上一节我们通过模板方法模式控制汽车跑起来的动作,那么需求是无止境的,现在如果老板又增加了额外的需求:汽车启动.停止.鸣笛引擎声都由客户自己控制,他想要什么顺序就什么顺 ...

  9. 设计模式之——Builder建造模式

    Builder模式又叫建造模式,是用于组装具有复杂结构的实例的模式. 示例程序是编写一个文档,并且写入到文件中,该文档具有以下结构,含有标题,字符串,一些条目. Builder抽象类,为建造模式的核心 ...

随机推荐

  1. How To Ask Questions The Smart Way

    How To Ask Questions The Smart Way Eric Steven Raymond Thyrsus Enterprises <esr@thyrsus.com> R ...

  2. P1092 虫食算 NOIP2002

    为了测试stl 30分的暴力写法... #include <bits/stdc++.h> using namespace std; const int maxn = 11; int n; ...

  3. 新建android项目报错,代码中找不到错误

    通过网上资料的引导,做以下操作: 1.进入C:\Documents and Settings\Administrator\.android 删除路径下的debug.keystore及 ddms.cfg ...

  4. android imageButton 点击按钮前中后,按钮颜色的变化

    我们在开发的过程中,往往为了美化界面的需要,会修改按钮的默认外观,而因为Android中的按钮有三种状态—默认,被点击,被选中.所以,如果要改变按钮的外观,需要对这三种情况都做出修改,也许在以往,我们 ...

  5. 蓝牙的AVCTP协议笔记

    1.概述     AVCTP协议描述了蓝牙设备间Audio/Video的控制信号交换的格式和机制,它是一个总体的协议,具体的控制信息由其指定的协议(如AVRCP)实现,AVCTP本身只指定控制comm ...

  6. jQuery 遍历json数组的实现代码

    <script type="text/javascript"> "}]; $(d1).each(function(){ alert(this.text+&qu ...

  7. ASP.NET MVC3 通过Url传多个参数方法

    MVC3通过URL传值,一般情况下都会遇到 [从客户端(&)中检测到有潜在危险的 Request.Path 值]的问题 这个问题的解决方法,我的其他博文已经有了说明,这里给出连接 ; [从客户 ...

  8. RTP协议分析(转自:http://blog.csdn.net/bripengandre/article/details/2238818)

    RTP协议分析 第1章.     RTP概述 1.1.  RTP是什么 RTP全名是Real-time Transport Protocol(实时传输协议).它是IETF提出的一个标准,对应的RFC文 ...

  9. ecshop详细的安装教程

    ECShop 的安装非常简单.方便,任何一种编码程序的安装方法都是一样的(即 GBK 和 UTF-8 版本的安装方法是一样的) 1.安装前的准备 docs目录下存放有 ECShop 安装说明(inst ...

  10. sublime text2 操作及插件

    sublime text2 1. 文件快速导航: 这是sublime上面很好用的功能之一,ctrl+p可以调出窗口,菜单上的解释是gotoanythings ,确实如其所言,调出窗口后,直接输入关键字 ...