设计模式学习(建造者模式)

来源:互联网 发布:jquery遍历二维数组 编辑:程序博客网 时间:2024/05/07 18:18

1. 建造者模式

建造者用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

建造者模式适用于:
一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离。 实际应用中,建造者模式出现的不多(还没见过)。

2. 案例

以一个建造房子的案例为例:


建造者模式

上述类图中,对象的创建是通过Director类来控制一个FlatBuilder或者VillaBuilder来进行创建House的实体对象的。
显然可以看到对象的创建过程使用Builder抽象类的两个子类完成的,然而对象数据是在House类中的,这样就实现了对象的构建和对象的表示分离。

#include <iostream>#include <string>#include <memory>using namespace std;/*房子类*/class House{public:    void SetFloor(string floor)    {        m_floor = floor;    }    void SetWall(string wall)    {        m_wall = wall;    }    void SetWindow(string window)    {        m_window = window;    }private:    string m_floor;    string m_wall;    string m_window;};class Builder{public:    virtual void makeFloor() = 0;    virtual void makeWall() = 0;    virtual void makeDoor() = 0;    virtual House* GetHouse() = 0;};//公寓建造队class FlatBuilder : public Builder{public:    FlatBuilder()    {        pHouse = new House;    }    virtual void makeFloor()    {        cout << "FlatBuilder make floor" << endl;    }    virtual void makeWall()    {        cout << "FlatBuilder make wall" << endl;    }    virtual void makeDoor()    {        cout << "FlatBuilder make door" << endl;    }    virtual House* GetHouse()    {        return pHouse;    }private:    House* pHouse;};//别墅建造队class VillaBuilder : public Builder{public:    VillaBuilder()    {        pHouse = new House;    }    virtual void makeFloor()    {        cout << "VillaBuilder make floor" << endl;    }    virtual void makeWall()    {        cout << "VillaBuilder make wall" << endl;    }    virtual void makeDoor()    {        cout << "VillaBuilder make door" << endl;    }    virtual House* GetHouse()    {        return pHouse;    }private:    House* pHouse;};class Director{public:    void Construct(Builder *builder)    {        builder->makeFloor();        builder->makeDoor();        builder->makeWall();    }};int main(){    House* pHouse = NULL;    Director* director = new Director;    Builder* builder = new FlatBuilder;    director->Construct(builder);    pHouse = builder->GetHouse();    delete builder;    delete director;    delete pHouse;    return 0;}
0 0