C++建造者模式(Builder)

 C++
时间:

使用场景

  1. 隔离复杂对象的创建和使用,相同的方法,不同执行顺序,产生不同事件结果

  2. 多个部件都可以装配到一个对象中,但产生的运行结果不相同

  3. 产品类非常复杂或者产品类因为调用顺序不同而产生不同作用

  4. 初始化一个对象时,参数过多,或者很多参数具有默认值

  5. Builder模式不适合创建差异性很大的产品类

  6. 产品内部变化复杂,会导致需要定义很多具体建造者类实现变化,增加项目中类的数量,增加系统的理解难度和运行成本

需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;

Builder

#include<iostream>
#include<string>

using namespace std;

class ProductPart;

class Product
{
    public:
        Product() { /* ProductPart::BuildPart();*/ cout << "return a product" << endl; }
        ~Product() { }
        void ProducePart() { cout << "build part of product." << endl; }
    protected:
    private:
};

/*
class ProductPart
{
    public:
        ProductPart() {}
        ~ProductPart() {}
        ProductPart* BuildPart() { return new ProductPart; }
    protected:
    private:
};*/

class Builder
{
    public:
        virtual ~Builder() {}
        virtual void BuildPartA(const string& buildPara) = 0;
        virtual void BuildPartB(const string& buildPara) = 0;
        virtual void BuildPartC(const string& buildPara) = 0;
        virtual Product* GetProduct() = 0;
    protected:
        Builder() {}
    private:
};

class ConcreteBuilder : public Builder
{
    public:
        ConcreteBuilder() {}
        ~ConcreteBuilder() {}
        void BuildPartA(const string& buildPara) { cout << "Step1:Build PartA..." << buildPara << endl; }
        void BuildPartB(const string& buildPara) { cout << "Step1:Build PartB..." << buildPara << endl; }
        void BuildPartC(const string& buildPara) { cout << "Step1:Build PartC..." << buildPara << endl; }
        Product* GetProduct() 
        { 
            BuildPartA("pre-defined"); 
            BuildPartB("pre-defined"); 
            BuildPartC("pre-defined");
            return new Product();
        }
    protected:
    private:
};

class Director
{
    public:
        Director(Builder* bld) { _bld = bld; }
        ~Director() {}
        void Construct() 
        {
            _bld->GetProduct()->ProducePart();
        }
    protected:
    private:
        Builder* _bld;
};

int main(int argc, char* argv[])
{
    Director* d = new Director(new ConcreteBuilder());
    d->Construct();
    return 0;
}

0 评论