首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Builder 构造器模式[通俗易懂]

Builder 构造器模式[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-22 14:23:43
发布2022-09-22 14:23:43
1K0
举报

大家好,又见面了,我是你们的朋友全栈君。

Builder 构造器模式

动机

在软件系统中,有时候面临着”一个复杂对象“的创建过程,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却通常相对稳定

如何应对这种变化?如何提供一种”封装机制“来隔离出”复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?

模式定义

将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建出不通的表示(变化)

实例

构建一个房子 朴素

代码语言:javascript
复制
class HouseBuilder{ 
   
public :
    void Init(){ 
   
        this->BuildPart1();
        for(int i = 1;i < 4;i ++){ 
   
            this->BuildPart2();
        }
        bool flag = this->BuildPart3();
        if(flag){ 
   
            this->BuildPart4();
        }
        this->BuildPart5();
    }
    virtual ~HouseBuilder();
protected:
    virtual void BuildPart1() = 0;
    virtual void BuildPart2() = 0;
    virtual void BuildPart3() = 0;
    virtual void BuildPart4() = 0;
    virtual void BuildPart5() = 0;
}

class StoneHouse : public HouseBuilder{ 
   
    protected:
    virtual void BuildPart1() = { 
   

    };
    virtual void BuildPart2() = { 
   
        
    };
    virtual void BuildPart3() = { 
   
        
    };
    virtual void BuildPart4() = { 
   
        
    };
    virtual void BuildPart5() = { 
   
        
    };
}

int main(){ 
   
    House *pHouse = new StoneHouse();
    pHouse->Init()
}

构造器模式

代码语言:javascript
复制
class House{ 
   
    //..
}
class HouseBuilder{ 
   
public :
    House getResult(){ 
   
        return pHouse;
    }
    
    virtual ~HouseBuilder();
protected:

    House *pHouse;
    virtual void BuildPart1() = 0;
    virtual void BuildPart2() = 0;
    virtual void BuildPart3() = 0;
    virtual void BuildPart4() = 0;
    virtual void BuildPart5() = 0;
}

class Stone : public House{ 
   

}
class StoneHouseBuilder : public HouseBuilder{ 
   
    protected:
    virtual void BuildPart1() = { 
   

    };
    virtual void BuildPart2() = { 
   
        
    };
    virtual void BuildPart3() = { 
   
        
    };
    virtual void BuildPart4() = { 
   
        
    };
    virtual void BuildPart5() = { 
   
        
    };
}

class HouseDirector{ 
   
public :
    HouseBuilder *pHouseBuilder;

    HouseDirector(HouseBuilder *pHouseBuilder){ 
   
        this->pHouseBulder = pHouseBuilder;
    }

    House Construct(){ 
   
        pHouseBuilder->BuildPart1();
        for(int i = 1;i < 4;i ++){ 
   
            pHouseBuilder->BuildPart2();
        }
        bool flag = pHouseBuilder->BuildPart3();
        if(flag){ 
   
            pHouseBuilder->BuildPart4();
        }
        pHouseBuilder->BuildPart5();
        return pHouseBuilder->GetResult();
    }
}

结构

要点总结

  • Builder模式主要用于“分步骤构建一个复杂对象”。在这其中“分步骤”是一个稳定的算法。而复杂对象的各个部分则经常变换。
  • 变化点在哪里,封装在哪里–Builder模式主要是在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动(Construct要求稳定)
  • 在Builder模式中。要注意不同语言中构造器调用虚函数的差别

笔记

  • C++里面构造函数调用自己的虚函数是静态绑定,
  • 一个类的构建过程太复杂 ,则应该重新提取类的代码 改变架构啥的
  • House是表示 HouseBuilder是构建 构建过程是稳定的
  • Builder要求Construct稳定,其缺点在于难以应对“分步骤构建算法”的需求变动(Construct要求稳定)

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168508.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Builder 构造器模式
  • 动机
  • 模式定义
  • 实例
  • 结构
  • 要点总结
  • 笔记
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档