C++ 建造者模式

建造者模式,又称为builder模式。

定义:

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

使用场景:

当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。

使用建造者模式有什么好处:

建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了 该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

 

代码实现:

#include#include#includeusing namespace std;

class Product{
private:
    vectorparts;

public:
    void Add(string part){
        parts.push_back(part);
    }

    void Show(){
        cout << "product building------------" << endl;
        vector::iterator it;
        for (it = parts.begin(); it != parts.end(); it++)
        {
            cout << *it << endl;
        }
    }
};

class Builder
{
public:
    virtual void BuildPartA() = 0;
    virtual void BuildPartB() = 0;
    virtual Product* GetResult() = 0;
};

class ConcreteBulider1:public Builder
{
private:
    Product* product;

public:
    ConcreteBulider1(){
        product = new Product();
    }

    ~ConcreteBulider1(){
        delete product;
    }

    void BuildPartA(){
        product->Add("part A");
    }

    void BuildPartB(){
        product->Add("part B");
    }

    Product* GetResult(){
        return product;
    }
};

class ConcreteBulider2 :public Builder
{
private:
    Product* product;

public:
    ConcreteBulider2(){
        product = new Product();
    }

    ~ConcreteBulider2(){
        delete product;
    }

    void BuildPartA(){
        product->Add("part X");
    }

    void BuildPartB(){
        product->Add("part Y");
    }

    Product* GetResult(){
        return product;
    }
};

class Director
{
public:
    void Construct(Builder* builder){
        builder->BuildPartA();
        builder->BuildPartB();
    }
};

//Client,客户不知道具体的建造过程。
int main()
{
    Director* director = new Director();

    Builder* builder1 = new ConcreteBulider1();
    Builder* builder2 = new ConcreteBulider2();

    cout << "指挥者用ConcreteBuilder1的方法建造产品:" << endl;
    director->Construct(builder1);
    Product* p1 = builder1->GetResult();
    p1->Show();
    cout << endl;

    cout << "指挥者用ConcreteBuilder2的方法建造产品:" << endl;
    director->Construct(builder2);
    Product* p2 = builder2->GetResult();
    p2->Show();
    cout << endl;

    delete director;
    delete builder1;
    delete builder2;

    system("pause");

    return 0;
}

代码说明:

(1)Builder:是为创建一个Product对象的各个部件指定的抽象接口。

(2)ConcreteBuilder:是具体创建者,实现Builder接口,构造和装配各个部件。

(3)Product:具体的产品角色。

(4)Director:指挥者,他是构建一个使用Builder接口的对象。

 

运行结果:

指挥者用ConcreteBuilder1的方法建造产品: product building------------ part A part B

指挥者用ConcreteBuilder2的方法建造产品: product building------------ part X part Y

上一篇:Photoshop CC 2021 软件安装教程


下一篇:R语言 ggplot2 多图排列 Part(2)