当前位置: 首页 > news >正文

创建型模式-----建造者模式

目录

背景:

构建模式UML                                                                                                              

代码示例

房子成品:

  构建器抽象:     

  具体构建器:

建筑师:

测试部分:



背景:

        软件构建过程中有时候一个复杂的对象的构建可分解为多个子对象按照一定的算法逻辑进行构建,这种构建算法基本稳定但构建的子部件却经常变化。

        创建者模式则是将构建的算法和子组件分开,将变化和不变分开,当子组件变化时只影响子组件本身不影响构建算法本身,加强了构建算法的封闭性,提升了组件的扩展性。

构建模式UML

        这里以建房子为例,房子构建过程抽象为地基、墙体、屋顶和装修等4个部分。四个部分构建流程基本不变,但是四个部分所用的材料和组合等均可以变化,根据构建模式其UML图如下。

                                                                                                              

代码示例

房子成品:

这里简化为四部分。 

struct House
{std::string HouseBase;std::string HouseWall;std::string HouseTop;std::string HouseDecorator;
};

  构建器抽象:     

class HouseBuilder
{
public:House*getHousr(){return m_house;}HouseBuilder(){m_house = new House();}~HouseBuilder(){if (m_house){delete m_house;}}virtual void buildPart1() = 0;virtual void buildPart2() = 0;virtual void buildPart3() = 0;virtual void buildPart4() = 0;
protected:House* m_house = nullptr;
};

  具体构建器:

        经常变化的构建,不同的房子需要不同的构建器,一套房子对应一种构建器;若有新品房子则需要重写构建器,增量开发不影响原本的构建器和建筑师建筑流程。

class StoneHouseBuilder :public HouseBuilder
{
public:void buildPart1() override { std::cout << "打水泥地基" << std::endl; m_house->HouseBase = "石头地基"; }void buildPart2() override { std::cout << "砌石头墙" << std::endl; m_house->HouseWall = "石头墙"; }void buildPart3() override { std::cout << "盖琉璃屋顶" << std::endl; m_house->HouseTop = "琉璃顶"; }void buildPart4() override { std::cout << "石灰滚刷装修,铺地装" << std::endl; m_house->HouseDecorator = "石灰滚刷装修,铺地装"; }
};class GrassHouseBuilder :public HouseBuilder
{
public:void buildPart1() override { std::cout << "木桩打地基" << std::endl;m_house->HouseBase = "木桩地基"; }void buildPart2() override { std::cout << "竹子编制墙" << std::endl; m_house->HouseWall = "竹子墙"; }void buildPart3() override { std::cout << "茅草盖屋顶" << std::endl; m_house->HouseTop = "茅草顶"; }void buildPart4() override { std::cout << "茅草遮墙做防风" << std::endl; m_house->HouseDecorator = "茅草遮墙做防风"; }
};

建筑师:

        建筑流程稳定,基本不变;根据使用不同的构建器可得到不同房子的建筑师,建出不同的房子。

class HouseDirector
{
public:HouseBuilder*pHouserBuilder = nullptr;HouseDirector(HouseBuilder*pHB) :pHouserBuilder(pHB) {}House* Construct() {//构建过程稳定不变 但是构建的各个组件部分剧烈变动pHouserBuilder->buildPart1();pHouserBuilder->buildPart2();pHouserBuilder->buildPart3();pHouserBuilder->buildPart4();return pHouserBuilder->getHousr();}	
};

测试部分:

void TestFun::TestBuilder()
{StoneHouseBuilder builder1;HouseDirector stone_Director(&builder1);House* pStoneHouse = stone_Director.Construct();GrassHouseBuilder builder2;HouseDirector grass_Director(&builder2);House* pgrassHouse = grass_Director.Construct();
}


http://www.mrgr.cn/news/58636.html

相关文章:

  • Rust初踩坑
  • 【3D】几何算法合集2(自用资源)方便cv
  • Fragments by E2B:AI生成应用模板,让应用开发更智能
  • vue2之混入(mixin)
  • 2286. 以组为单位订音乐会的门票
  • 【React系列四】—React学习历程的分享
  • 为什么磁链的基准值ψB=UB*tB
  • 用人工智能,应该怎么掏钱?
  • frida脚本,自动化寻址JNI方法
  • 【C++】一文带你深入理解C++异常机制
  • 7款视频转换器大测评!哪款是最适合你的视频格式转换器?
  • 现代Web界面交互新利器!来探一探这个魔法组件库——MagicUI
  • python 访问openai assistant api(一)
  • 金融工程--pine-script 入门
  • 【python实战】利用代理ip爬取Alibaba海外版数据
  • 从视频中学习的SeeDo:通过VLM解释视频并生成规划、代码(含通过RGB视频模仿的人形机器人OKAMI、DexMV)
  • 机器学习与神经网络的当下与未来
  • Vue学习记录之二十一 Vue3中3种编程风格介绍
  • 凯伦股份荣获中国钢结构协会2024年度技术创新奖
  • 第二单元历年真题整理
  • 文本预处理——构建词云
  • Matlab学习02-matlab中的数据显示格式及符号变量
  • AIGC底层技术揭秘
  • 揭开C++ STL的神秘面纱之string:提升编程效率的秘密武器
  • Java如何实现站内消息系统的设计与实现
  • C++游戏开发教程:从入门到进阶