13 大话设计模式C++实现之建造者模式

本文通过炒菜和画小人的例子介绍了建造者模式,它将复杂对象的构建与表示分离,使相同构建过程可创建不同表示。文章通过抽象建造者、具体建造者和指挥者类展示了如何使用建造者模式来构建产品。
摘要由CSDN通过智能技术生成

例子说明1:炒菜没放盐和肯德基的标准化

例子说明2:画一个不同形态的小人(高矮胖瘦各不同)

/*
建造者模式(生成器模式):
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式可以将一个产品的内部表象与产品的生成过程分隔开来,从而可以使一个建造过程生成具有不同的内部表象的产品。
如果我们使用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到他们,而且具体的建造过程不需要知道
*/
#include<iostream>
#include<string>
#include<list>

using namespace std;


//产品类,由多个部件构成
class Product
{
private:
    list<string> *parts = new list<string>();
public:
    Product()
    {
    
    }
    void Add(string part)
    {
        parts->push_back(part);
    }
    void Show()
    {
        cout << "\n 产品 创建--------" << endl;
        for (auto e : (*parts))
        {
            cout << e << endl;
        }
    }

    ~Product()
    {
        if (parts != NULL)
        {
            delete parts;
            parts = NULL;
        }
    }
};

//Builder类,抽象建造者类,确定由两个部件PartA和PartB组成并声明一个得到产品建造后结果的方法
/*
抽象类用来规定某个产品的必要组成部分,就像做菜必须要放盐,放酱油等等,画人必须要有头脚手躯干。
*/
class Builder
{
public:
    virtual void BuildPartA() = 0;
    virtual void BuildPartB() = 0;
    virtual Product& GetReult() = 0;
};

//具体建造者类,画一个胖子或者瘦子,加一勺盐两勺盐等过程的具体实现
class ConcreteBuilder1 : public Builder
{
private:
    Product *product = new Product();
public:
    virtual void BuildPartA()
    {
        product->Add("部件A");
    }
    virtual void BuildPartB()
    {
        product->Add("部件B");
    }
    virtual Product& GetReult()
    {
        return *product;
    }
};

class ConcreteBuilder2 : public Builder
{
private:
    Product *product = new Product();
public:
    virtual void BuildPartA()
    {
        product->Add("部件X");
    }
    virtual void BuildPartB()
    {
        product->Add("部件Y");
    }
    virtual Product& GetReult()
    {
        return *product;
    }
};

//指挥者类
class Director
{
public:
    //用于控制具体构建哪些模块或者实现哪些步骤
    void Construct(Builder* builder)
    {
        builder->BuildPartA();
        builder->BuildPartB();
    }
};

void Client()
{
    //客户端不需要知道具体的建造过程,仅需要通过指挥者对象控制具体的构建内容
    Director *director = new Director();
    Builder *b1 = new ConcreteBuilder1();
    Builder *b2 = new ConcreteBuilder2();

    director->Construct(b1);
    Product p1 = b1->GetReult();
    p1.Show();

    director->Construct(b2);
    Product p2 = b2->GetReult();
    p2.Show();

    if (director != NULL)
    {
        delete director;
        director = NULL;
    }
    if (b1 != NULL)
    {
        delete b1;
        b1 = NULL;
    }
    if (b2 = NULL)
    {
        delete b2;
        b2 = NULL;
    }
}

int main()
{
    Client();
    system("pause");
    return 0;
}

运行结果:


 产品 创建--------
部件A
部件B

 产品 创建--------
部件X
部件Y
请按任意键继续. . .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值