ڼС
梦回起点
做你害怕做的事,你会发现:不过如此
本站基于WordPress—主题by 设计窝
冀ICP备15003737号
梦回起点
Copyright © 2015-2024 All rights reserved.

建造者模式——大话设计模式读书笔记

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

下面是建造者模式的UML图:

建造者模式

下面是C++实现的代码:

/*
* initm.com
* 作者:Stupid
* 时间:2017-10-25 21:36
* 描述: 代码使用QT5.9+MinGW53_32编译通过,代码为建造者模式的基本结构代码。
*/
#include <QCoreApplication>
#include <iostream>
#include <list>

template <typename T>
class Product
{
private:
    std::list<T> list;
public:
    void Add(T data){
        list.push_back(data);
    }
    void Show(){
        for(auto index: list){
            std::cout << index << std::endl;
        }
    }
};

class Builder
{
protected:
    Product<const char*>* product;
public:
    Builder(){
        product = new Product<const char*>;
    }
    virtual void BuildPartA()=0;
    virtual void BuildPartB()=0;
    virtual Product<const char*>* GetResult()=0;
    virtual ~Builder(){
        if(product){
            delete product;
        }
    }
};

class ConcreteBuilder1: public Builder
{
public:
    void BuildPartA()override final{
        product->Add("PartA");
    }
    void BuildPartB()override final{
        product->Add("PartB");
    }
    Product<const char*>* GetResult()override final{
        return product;
    }
};

class ConcreteBuilder2: public Builder
{
public:
    void BuildPartA()override final{
        product->Add("PartX");
    }
    void BuildPartB()override final{
        product->Add("PartY");
    }
    Product<const char*>* GetResult()override final{
        return product;
    }
};

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

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Director* director = new Director;
    Builder* builder1 = new ConcreteBuilder1;
    director->Construct(builder1);
    builder1->GetResult()->Show();
    std::cout << "---------------------------------" << std::endl;
    Builder* builder2 = new ConcreteBuilder2;
    director->Construct(builder2);
    builder2->GetResult()->Show();

    return a.exec();
}

建造者模式的优点在于建造者隐藏了建造过程,如果想构建新的建造过程,那么只需要增加一个新的建造类就可以了。

2017-10-25
                         
暂无评论

发表回复