创建型模式之Builder模式

1、意图

将一个复杂对象的创建与它的表示分享,使得同样的构建过程可以创建不同的表示。

2、适用性

(1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时

(2)当构造过程必须允许被构造对象有不同的表示时

3、参与者

Builder:为创建一个Product对象的各个部件指定抽象接口

ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件;定义并明确它所创建的表示;提供一个检索产品的接口

Director:构造一个使用Builder接口的对象

Product:表示被构造的复杂对象;包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

UML类图表示为

4、协作

(1)客户创建Director对象,并用它所想要的Builder进行配置

(2)一旦产品部件被生成,导向器就会通知生成器

(3)生成器处理导向器的请求,将将部件添加到产品中

(4)客户从生成器中检索产品

UML序列图表示为

5、效果

(1)它使你可以改变一个产品的内部表示

(2)它将构造代码和表示代码分开

(3)它使你对构造过程进行更精细的控制

6、相关模式

AbstractFactory与Builder相似,因为它也可以创建复杂对象。主要的区别是Builder模式着重于一步步构造一个复杂对象。而AbstractFactory着重于多个系列的产品对象。

c++的例子代码如下

#include <iostream>
#include <string>

using namespace std;

class Product
{
    string parts;
public:
    Product(){}
    ~Product(){}
    
    void addPart(string part) { parts += part + " ";}
    string getPart() {return parts; }
};

class Builder
{
public:
    virtual void buildPart1() = 0;
    virtual void buildPart2() = 0;
};

class ConcreteBuilder1 : public Builder
{
    Product product;
public:
    void buildPart1()
    {
        product.addPart("Builder1");
    }
    
    void buildPart2()
    {
        product.addPart("pattern");
    }
    
    Product& getProduct() {return product;}
};

class ConcreteBuilder2 : public Builder
{
    Product product;
public:
    void buildPart1()
    {
        product.addPart("Builder2");
    }
    
    void buildPart2()
    {
        product.addPart("pattern");
    }
    
    Product& getProduct() {return product;}
};

class Director
{
    Builder &builder;
public:
    Director(Builder &build):builder(build){}
    
    void construct()
    {
        builder.buildPart1();
        builder.buildPart2();
    }
};

int main()
{
    ConcreteBuilder1 builder1;
    ConcreteBuilder2 builder2;
    
    Director director1(builder1);
    director1.construct();
    
    Director director2(builder2);
    director2.construct();
    
    Product& product1 = builder1.getProduct();
    cout << product1.getPart() << endl;
    
    Product& product2 = builder2.getProduct();
    cout << product2.getPart() << endl;
    
    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值