第13章建造者模式

不打扰是莪最后的温柔 提交于 2020-01-28 12:02:30

一 概念

  • 当需要将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图时,我们需要应用于一个设计模式,建造者模式,又叫生成器模式,建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们使用了建造者模式,那么用户就只需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。

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

二 角色

  • Builder 是为创建一个Product对象的各个部件制定的抽象接口
  • ConcreteBuilder 是具体的创建者,实现Builder接口,构造和装配各个部件
  • Product 具体的产品角色
  • Director 指挥者,他是构建一个使用Builder接口的对象

三 C++代码实现

//建造者模式
#include "pch.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

//产品类-由多个部件组成
class Product
{
public:
    void Add(string part)  //添加产品部件
    {
        parts.push_back(part);
    }
    void Show()  //列举所有的产品部件
    {
        cout << "\n产品 创建 --" << endl;
        for (vector<string>::iterator it = parts.begin(); it != parts.end(); ++it)
        {
            cout << *(it) << endl;
        }
    }
private:
    vector<string> parts;
};
//Builder类-抽象建造者类,确定产品由两个部件PartA和PartB组成
//并声明一个得到产品建造后结果的方法GetResult
class Builder
{
public:
    virtual void BuildPartA() = 0;
    virtual void BuildPartB() = 0;
    virtual Product* GetResult() = 0;
};

//具体建造者类
class ConcreteBuilder1 : public Builder
{
public:
    ConcreteBuilder1()
    {
        product = new Product;
    }
    ~ConcreteBuilder1()
    {
        delete product;
    }
    void BuildPartA() override
    {
        product->Add("部件A");
    }
    void BuildPartB() override
    {
        product->Add("部件B");
    }
    Product* GetResult() override
    {
        return product;
    }
private:
    Product* product;

};

//具体建造者类
class ConcreteBuilder2 : public Builder
{
public:
    ConcreteBuilder2()
    {
        product = new Product;
    }
    ~ConcreteBuilder2()
    {
        delete product;
    }
    void BuildPartA() override
    {
        product->Add("部件X");
    }
    void BuildPartB() override
    {
        product->Add("部件Y");
    }
    Product* GetResult() override
    {
        return product;
    }
private:
    Product* product;

};

//指挥者类
class Director
{
public:
    void Construct(Builder* builder)
    {
        builder->BuildPartA();
        builder->BuildPartB();
    }
};

//客户端
int main()
{
    Director* director = new Director;
    Builder* b1 = new ConcreteBuilder1;
    Builder* b2 = new ConcreteBuilder2;

    //指挥者用ConcreteBuilder1的方法来建造产品
    director->Construct(b1);
    Product* p1 = b1->GetResult();
    p1->Show();
    //指挥者用ConcreteBuilder2的方法来建造产品
    director->Construct(b2);
    Product* p2 = b2->GetResult();
    p2->Show();
    
    system("pause");

    return 0;
}

参考资料
1 《大话设计模式C++实现-第13章-建造者模式》 https://blog.csdn.net/xiqingnian/article/details/42005627
2 《大话设计模式》 程杰 著

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!