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

设计模式之构建器模式

作者: 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