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

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

目录

背景:

构建模式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.kler.cn/a/370893.html

相关文章:

  • Jenkinsfile共享库介绍
  • docker一张图理解
  • 玩转随机数:用 JavaScript 掌控不可预测的魔力!
  • 【Linux】进程间通信IPC
  • citrix netscaler13.1 重写负载均衡响应头(基础版)
  • Jmeter进行http接口并发测试
  • 金蝶云星空采购退料单集成易仓出库单实现高效数据对接
  • 安宝特分享 | AR技术引领:跨国工业远程协作创新模式
  • goalng框架Gin解析
  • Python小白学习教程从入门到入坑------第十八课 异常模块与包【上】(语法基础)
  • VoLTE 微案例:VoLTE 注册失败,I-CSCF 返回 403,HSS(UAR) 返回 5001
  • 鸿蒙HarmonyOS next开发容器类库使用
  • VSCode 设置环境变量(WSL 2)
  • gcc与mingw64版本介绍
  • Ubuntu22.04版本左右,扩充用户可使用内存
  • 安卓取消触摸屏幕的指针效果
  • 为什么廉价的谷歌SEO服务往往是陷阱?
  • 鸿蒙next之axios二次封装并携带cookie
  • Docker加载并运行别人的容器的同时挂在本地其他文件
  • 影刀RPA与Python作为爬虫的对比
  • 线程的同步
  • MFC实现以不规则PNG图片作为窗口背景
  • IMX6ULL之使用汇编操作GPIO
  • mac 上使用 cmake 构建包含 OpenMP 的项目
  • 网络请求自定义header导致跨域问题
  • 「二叉树进阶题解:构建、遍历与结构转化全解析」