【设计模式基础】创建型模式 - 5 - 生成器(Builder)
来源:互联网 发布:域名生成二维码 编辑:程序博客网 时间:2024/04/30 15:59
1. 模式意图
将一个复杂对象(Product)的构建过程与它的表示相分离,使得同样的构建过程可以创建不同的表示。
生成器模式使用的对象:
在有些情况下,一个对象会有一些性质:在他么没有恰当的值之前,对象不能作为一个完整的产品使用。例如,一个电子邮件有发件人地址、收件人地址、主题、内容、附件等部分,而在最起码的收件人地址未被赋值之前,这个电子邮件不能发出。
在有些情况下,一个独享的一些性质必须按照某个顺序赋值才有意义。在某个性质没有赋值之前,另一个性质则无法赋值;这些情况使得性质本身的构造涉及到复杂的商业逻辑。
这些时候,此对象相当于一个有待构造的产品,而对象的这些性质则相当于产品的零件,构造产品的过程就是组合零件的过程。
由于组合零件的过程很复杂,因此,这些零件的构造过程往往被外部化到一个成为生成器的对象里,生成器返回给客户端的是一个全部零件都建造完毕的产品对象。
Abstract Factory与Builder模式很相似,因为它也可以创建复杂对象。主要的区别是:Builder模式着重与一步步构造一个复杂对象;而Abstract Factory模式着重于对各系列的产品对象。Builder在最后的一步返回产品;而对于Abstract Factory来说,产品是立即返回的。(Builder模式返回一个最终的产品Product,而组成Product的零件Parts则最为Builder的中间过程不返回给客户端;Abstract Factory模式每次返回的都是某个产品系列中的某一个具体的产品)
2. 模式定义
生成器(Builder):给出一个抽象接口,以规范产品对象的各个组成成分的构造。一般而言,此接口独立于应用程序的商业逻辑。
具体生成器(Concrete Builder):实现Builder提供的几口,一步一步完成创建产品的过程;在构造过程完成后,返回产品的接口。
Director: 调用具体生成器以创建产品对象.
Product:产品便是构造中的复杂对象。
Director将客户端创建产品的请求划分为对各个零件的构造请求,在将这些请求委派给具体构造者.具体构造者是做具体构造工作的,但却不为客户端所知.
3. 模式实现
3.1 C#
using System;using System.Collections;class Director{ public void Construct( Builder builder ) { builder.BuildPartA(); builder.BuildPartB(); }}abstract class Builder{ abstract public void BuildPartA(); abstract public void BuildPartB(); abstract public Product GetResult();}class ConcreteBuilder1 : Builder{ private Product product; override public void BuildPartA() { product = new Product(); product.Add( "PartA" ); } override public void BuildPartB() { product.Add( "PartB" ); } override public Product GetResult() { return product; }}class ConcreteBuilder2 : Builder{ private Product product; override public void BuildPartA() { product = new Product(); product.Add( "PartX" ); } override public void BuildPartB() { product.Add( "PartY" ); } override public Product GetResult() { return product; }}class Product{ ArrayList parts = new ArrayList(); public void Add( string part ) { parts.Add( part ); } public void Show() { Console.WriteLine( " Product Parts -------" ); foreach( string part in parts ) Console.WriteLine( part ); }}public class Client{ public static void Main( string[] args ) { Director director = new Director( ); Builder b1 = new ConcreteBuilder1(); Builder b2 = new ConcreteBuilder2(); director.Construct( b1 ); Product p1 = b1.GetResult(); p1.Show(); director.Construct( b2 ); Product p2 = b2.GetResult(); p2.Show(); }}
4. 模式应用
在以下情况下使用生成器模式:
- 需要生成的产品对象有复杂的内部结构
- 需要生成的产品对象的属性相互依赖,生成器模式可以强迫生成顺序
- 在对象构造过程中会使用到系统中的一些其他对象,这些对象在产品对象的创建过程中不易得到
- Composite模式通常是用Builder生成的
- 生成器模式的使用使得产品的内部表象可以独立的变化;使用生成器模式可以使客户端不必知道产品内部组成的细节
- 每个Builder都是相对独立,而与其他的Builder无关
4.1 内容转换成不同的文件类型
- 【设计模式基础】创建型模式 - 5 - 生成器(Builder)
- 设计模式-创建型-builder生成器
- 设计模式之生成器(Builder)----对象创建型模式
- 设计模式-创建型模式之 Builder(生成器)
- 【设计模式】创建型模式之生成器Builder
- 设计模式深入学习-Builder生成器(创建型模式 )
- 设计模式之对象创建型 — builder 生成器模式
- Builder生成器(创建型模式)
- Builder生成器(创建型模式)
- 【创建型模式】builder(生成器)
- 创建型模式-生成器(builder)
- Builder 生成器模式(创建型模式)
- 设计模式----Builder(生成器)
- builder(生成器设计模式)
- 设计模式 - 生成器 Builder
- 设计模式->BUILDER(生成器)
- 设计模式--创建型- Builder(生成器/创建者)
- 设计模式之建造者模式(生成器模式)(Builder) 创建型模式
- 还是优化 成熟游戏的优化
- C#语言各种集合介绍
- 序列化
- JAVA hdu 2013(蟠桃记)&&hdu 2035(人见人爱A^B)
- UVa 10167 Birthday Cake (白皮书第七章 生日蛋糕)
- 【设计模式基础】创建型模式 - 5 - 生成器(Builder)
- VS上测试运行时间
- Lua 学习笔记 一
- 4.1.4: jQuery事件之事件冒泡
- 4.1.5:jQuery事件之事件对象的属性
- 4.1.6: jQuery事件之移除事件
- 4.1.7: jQuery事件之模拟操作
- 4.1.8: jQuery事件之其他用法
- 4.2.1: jQuery动画之show()方法和hide()方法