建造者模式(Builder)

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


 构建过程分为:客户-指导-生成器 Client - Director - Builder:

类图:

 时序图:

具体实现:

#import <iostream>
#import <string>
//最终被建造产品
class IHouse{
public:
    virtual ~IHouse(){}
protected:
    int _foundationCount;
    int _cementFrameCount;
    int _brickCount;
    int _wattsCout;
    int _pipeCount;
    int _windowCount;
public:
    virtual void setfoundationCount(int count) = 0;
    
    virtual void setCementFrameCount(int count) = 0;
    
    virtual void setBrickCount(int count) = 0;
    
    virtual void setWattsCout(int count) = 0;
    
    virtual void setPipeCount(int count) = 0;
    
    virtual void setWindowCount(int count) = 0;
};

//别墅
class Villa:public IHouse{
    void setfoundationCount(int count){
        _foundationCount = count;
        std::cout << "构建别墅地基个数:" << _foundationCount <<std::endl;
    }
    void setCementFrameCount(int count){
        _cementFrameCount = count;
        std::cout << "构建别墅水泥构建个数:" << _cementFrameCount <<std::endl;
    }
    void setBrickCount(int count){
        _brickCount = count;
        std::cout << "构建别墅砖的个数:" << _brickCount <<std::endl;
    }
    void setWattsCout(int count){
        _wattsCout = count;
        std::cout << "构建别墅瓦片数:" << _wattsCout <<std::endl;
    }
    void setPipeCount(int count){
        _pipeCount = count;
        std::cout << "构建别墅管道个数:" << _pipeCount <<std::endl;
    }
    void setWindowCount(int count){
        _windowCount = count;
        std::cout << "构建别墅窗子个数:" << _windowCount <<std::endl;
    }
};

//民房
class PrivateHouse:public IHouse{
    void setfoundationCount(int count){
        
    }
    void setCementFrameCount(int count){
       
    }
    void setBrickCount(int count){
        
    }
    void setWattsCout(int count){
      
    }
    void setPipeCount(int count){
       
    }
    void setWindowCount(int count){
     
    }
};

//建造者接口
class IBuilder{
public:
    virtual ~IBuilder(){}
public:
    //地基
    virtual void buildFoundation() = 0;
    //水泥框架
    virtual void buildCementFramework() = 0;
    //墙
    virtual void buildWall() = 0;
    //砖
    virtual void buildBrick() = 0;
    //瓦
    virtual void buildWatts() = 0;
    //管道
    virtual void buildPipe() = 0;
    //窗户
    virtual void buildWindow() = 0;

    virtual IHouse* getBuildResult() = 0;
};

//别墅构造
class ViallaBuilder:public IBuilder{
private:
    IHouse*     _house;
public:
    ViallaBuilder(IHouse* house){
        _house = house;
    }
public:
    void buildFoundation(){
        std::cout << "开始构建别墅地基" << std::endl;
        _house -> setfoundationCount(1);
    }
      //水泥框架
    void buildCementFramework(){
        std::cout << "开始构建别墅水泥框架" << std::endl;
         _house -> setCementFrameCount(20);
    }
      //墙
    void buildWall(){
        std::cout << "开始构建别墅墙" << std::endl;
         _house -> setWattsCout(90);
    }
      //砖
    void buildBrick(){
        std::cout << "开始构建别墅砖" << std::endl;
        _house -> setBrickCount(29900);
    }
      //瓦
    void buildWatts(){
        std::cout << "开始构建别墅瓦" << std::endl;
        _house -> setWattsCout(5000);
    }
      //管道
    void buildPipe(){
        std::cout << "开始构建别墅管道" << std::endl;
        _house -> setPipeCount(100);
    }
      //窗户
    void buildWindow(){
        std::cout << "开始构建别墅窗户" << std::endl;
        _house -> setCementFrameCount(20);
    }
    
    IHouse* getBuildResult(){
        return _house;
    }
};

//民房建造者
class PrivateHouseBuilder:public IBuilder{
private:
    IHouse*     _house;
public:
    PrivateHouseBuilder(IHouse* house){
        _house = house;
    }
public:
    void buildFoundation(){
        std::cout << "构建民房地基" << std::endl;
    }
      //水泥框架
    void buildCementFramework(){
        std::cout << "构建民房水泥框架" << std::endl;
    }
      //墙
    void buildWall(){
        std::cout << "构建民房墙" << std::endl;
    }
      //砖
    void buildBrick(){
        std::cout << "构建民房砖" << std::endl;
    }
      //瓦
    void buildWatts(){
        std::cout << "构建民房瓦" << std::endl;
    }
      //管道
    void buildPipe(){
        std::cout << "构建民房管道" << std::endl;
    }
      //窗户
    void buildWindow(){
        std::cout << "构建民房窗户" << std::endl;
    }
    
    IHouse* getBuildResult(){
        return _house;
    }
};

//指导者
class Director{
public:
    IHouse* constructVialla(IBuilder* builder){
        builder -> buildFoundation();
        builder -> buildCementFramework();
        builder -> buildWall();
        builder -> buildBrick();
        builder -> buildWatts();
        builder -> buildPipe();
        builder -> buildWindow();
        return builder -> getBuildResult();
    }
    
    IHouse* constructPrivateHouse(IBuilder* builder){
        builder -> buildFoundation();
        builder -> buildCementFramework();
        builder -> buildWall();
        builder -> buildBrick();
        builder -> buildWatts();
        builder -> buildPipe();
        builder -> buildWindow();
        return builder -> getBuildResult();
    }
};
//client 充当客户端
int main(int argc, const char * argv[]) {
    // insert code here...
    Director* director = new Director();
    
    IBuilder* viallaBuilder = new ViallaBuilder(new Villa());
    IHouse* viallaHouse = director -> constructVialla(viallaBuilder);
    
    IBuilder* privateHouseBuilder = new PrivateHouseBuilder(new PrivateHouse());
    IHouse* privateHouseHouse =  director -> constructPrivateHouse(privateHouseBuilder);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值