建造者模式

2017-05-15  本文已影响13人  星月西

1.简介

建造者模式主要是用于创建一些复杂的对象,这些对象内部构建简的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
用途:使得建造代码和表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如果需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

2.实例

#include <iostream>
#include <vector>
#include <string>
using namespace std;

//产品类
class Product
{
public:
    void add(const string &part)
    {
        parts.push_back(part);
    }

    void print() const
    {
        for (const string &i : parts)
        {
            cout << i << endl;
        }
    }
private:
    vector<string> parts;
};

//建造者基类
class Builder
{
public:
    //为多态基类声明一个虚析构函数
    virtual ~Builder()
    {

    }

    //创建部件A
    virtual void buildPartA() = 0;

    //创建部件B
    virtual void buildPartB() = 0;

    //获取创建后的产品
    virtual Product getResult() const = 0;

protected:
    Product product;
};

//具体建造类1
class ConcreteBuilder1 : public Builder
{
public:
    virtual void buildPartA() override
    {
        product.add("Part A1");
    }

    virtual void buildPartB() override
    {
        product.add("Part B1");
    }

    virtual Product getResult() const override
    {
        return product;
    }
};

//具体建造类2
class ConcreteBuilder2 : public Builder
{
public:
    virtual void buildPartA() override
    {
        product.add("Part A2");
    }

    virtual void buildPartB() override
    {
        product.add("Part B2");
    }

    virtual Product getResult() const override
    {
        return product;
    }
};

//指挥者类
class Director
{
public:
    //指挥建造过程
    Product construct(Builder &builder) const   
    {   
        builder.buildPartA();
        builder.buildPartB();
        return builder.getResult();
    }
};

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

    Product p1=director.construct(*b1);
    Product p2=director.construct(*b2);
    p1.print();
    p2.print();

    delete b1;
    delete b2;

    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读