美文网首页
设计模式之构建器模式

设计模式之构建器模式

作者: coolTigers | 来源:发表于2020-01-09 23:25 被阅读0次

意图:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
构建器模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
构建器和模板方法有类似之处,但并不完全相同;模板方法针对的是一个算法中部分步骤是变化,需要重写;而构建器算法步骤是稳定的,但是每个对象的各个步骤经常发生变化。
假设有一个类负责房屋建筑:

class House{
public:
    void Init()
    {
        this->BuildFloor();
        for(int i = 0; i < 4; ++i) {
            this->BuildWalls();
        }
        this->BuildDoor();
        this->BuildWindows();
        this->BuildRoof();
    } 
    virtual ~House(){}
protected:
    virtual void BuildFloor() = 0;
    virtual void BuildWalls() = 0;
    virtual void BuildDoor() = 0;
    virtual void BuildWindows() = 0;
    virtual void BuildRoof() = 0;
};

现在需要建筑一个石头房屋:

class StoneHouse:public House{
protected:
    virtual void BuildFloor() 
    {
    }
    virtual void BuildWalls()
    {
    }
    virtual void BuildDoor()
    {
    }
    virtual void BuildWindows() 
    {
    }
    virtual void BuildRoof() 
    {
    }
};

至此,构建器模式就已经实现了。但是呢,实际上还是有优化空间的,比如House这个类还有其他的成员和函数,那么一大串的Init函数会让这个类很“臃肿”,那么还可以继续优化,将Init函数部分独立成一个类,专注于构建房屋方法:

class House{
  //。。。
};

class HouseBuilder{
public:
    House* GetResult()
    {
        return pHouse;
    }
    virtual ~HouseBuilder(){}
protected:
    House* pHouse;
    virtual void BuildFloor() = 0;
    virtual void BuildWalls() = 0;
    virtual void BuildDoor() = 0;
    virtual void BuildWindows() = 0;
    virtual void BuildRoof() = 0;
};

class StoneHouse:public House{
};

class StoneHouseBuilder: public HouseBuilder{
protected:
    virtual void BuildFloor() 
    {
    }
    virtual void BuildWalls()
    {
    }
    virtual void BuildDoor()
    {
    }
    virtual void BuildWindows() 
    {
    }
    virtual void BuildRoof() 
    {
    }
};

class HouseDirector{
public:
    HouseBuilder* pHouseBuidler;
    HouseDirector(HouseBuiler* _pHouseBuilder)
    {
        this->pHouseBuilder = _pHouseBuilder;
    }
    House* Constructor(){
         pHouseBuilder->BuildFloor();
        for(int i = 0; i < 4; ++i) {
            pHouseBuilder->BuildWalls();
        }
        pHouseBuilder->BuildDoor();
        pHouseBuilder->BuildWindows();
        pHouseBuilder->BuildRoof();
        return pHouseBuilder->GetResult();
    }
};

int main()
{
    HouseBuilder* pHouseBuilder = new StoneHouseBuilder();
    HouseDirector pHouseDirector(pHouseBuilder);
    House* pHouse = pHouseDirector.Constructor();
    delete pHouseBuilder;
    return 0;
}

相关文章

网友评论

      本文标题:设计模式之构建器模式

      本文链接:https://www.haomeiwen.com/subject/pcreactx.html