设计模式三:Builder 生成器——对象创建型模式

Builder 生成器——对象创建型模式


1.意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

 
2.动机
一个RTF文档交换格式的阅读器应该能将RTF转换成多种正文格式。要能够容易地实现新的转换,同时不改变RTF阅读器


3.适用性
当创建复杂对象的算法应独立于该对象的组成部分以及他们的装配方式时
当构造过程必须允许被构造的对象有不同的表示时。


4.表示
用一张别人的图
http://www.cnblogs.com/woainilsr/archive/2012/04/05/2433153.html

 

image
 
 
 
5.参与者
builder
为创建一个product对象的各个部件指定抽象接口
ConcreteBuilder
实现builder的接口以构造和装配该产品的各个部件
定义并明确它所创建的表示
提供一个检索产品的接口
Director
创造一个使用Builder接口的对象
Product
表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并且定义它的装配过程。
包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
 

6.协作
image

客户创建Director对象,并用它所想要的builder对象进行配置
一旦产品部件被生成,导向器就会通知生成器
生成器处理导向器的请求,并将部件添加到产品中
客户从生成器中检索产品
 

7.效果
1)使你可以改变一个产品的内部表示。builder对象提供给导向器一个构造产品的抽象接口
2)它将构造代码和表示代码分开。通过封装一个复杂对象的创建和表示方式提高对象的模块性
3)可以实现对构造过程更精细的控制
 

8.实现
通常有一个抽象的builder类为导向者可能要求创建的每一个构件定义一个操作。这些操作在缺省情况下什么都不做。一个ConcreteBuilder对它有兴趣创建的构件重定义这些操作。
1)装配和构造接口
生成器逐步的构造他们的产品。因此builder类接口必须足够普遍,以便各种类型的具体生成器构造产品。
关键问题在于构造和装配过程的模型,构造请求的结果只是被添加到产品中。
2)产品没有抽象类
由具体生成器生成的产品,表示相差很大,以至于给不同的产品以公共父类没有太大的意思。
3)在builder中缺省的方法为空
使客户可以只重定义他们所感兴趣的操作。
 

9.代码示例
#include<iostream>
using namespace std;

class HouseBuilder
{
    public:
    virtual void buildWall(){}
    virtual void buildDoor(){}
    virtual void buildWindow(){}
};

class ConcreteBuilder:public HouseBuilder
{
    public:
    void buildWall()
    {
        cout<<"wall built"<<endl;
    }
    void buildDoor()
    {
        cout<<"door built"<<endl;
    }
    void buildWindow()
    {
        cout<<"window built"<<endl;
    }
};

class director
{
    public:
    director(HouseBuilder &b)
    {
        b.buildWall();
        b.buildWall();
        b.buildWall();
        b.buildWindow();
        b.buildDoor();
    }
};

class director2
{
    public:
    director2(HouseBuilder &b)
    {
        b.buildWall();
        b.buildWall();
        b.buildWall();
        b.buildWindow();
        b.buildDoor();
        b.buildWindow();
        b.buildDoor();
    }
};

int main()
{
    ConcreteBuilder cb;
    cout<<"build first house"<<endl<<endl;
    director d(cb);
    cout<<"build second house"<<endl<<endl;
    director2 d2(cb);
    return 0;
}

 


10.相关模式
abstract Factory和builder相似,因为可以创建复杂对象。
区别在于builder模式更注重于一步一步构造一个复杂对象,最后一步返回产品
而abstractFactory着重于多个系列的产品对象(简单的或者复杂的),产品会立即返回
composite通常使用builder生成的。
 
posted @ 2012-05-18 18:25  w0w0  阅读(272)  评论(0)    收藏  举报