设计模式(二十三) 建造者模式 C++

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

变的构造方法,不变的构造顺序

Builder模式和工厂模式的区别

Factory模式中

  • 有一个抽象的工厂。
  • 实现一个具体的工厂---汽车工厂。
  • 工厂生产汽车A,得到汽车产品A。
  • 工厂生产汽车B,得到汽车产品B。

这样做,实现了购买者和生产线的隔离。强调的是结果。

Builder模式

  • 引擎工厂生产引擎产品,得到汽车部件A。
  • 轮胎工厂生产轮子产品,得到汽车部件B。
  • 底盘工厂生产车身产品,得到汽车部件C。
  • 将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。
  • 将这个整体送到汽车组装工厂,得到一个汽车产品。

这样做,目的是为了实现复杂对象生产线和其部件的解耦。强调的是过程

两者的区别在于

  • Factory模式不考虑对象的组装过程,而直接生成一个我想要的对象。
  • Builder模式先一个个的创建对象的每一个部件,再统一组装成一个对象。
  • Factory模式所解决的问题是,工厂生产产品。
  • 而Builder模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品。
  • Builder模式不是很常用。模式本身就是一种思想。知道了就可以了。

设计模式就是一种思想。学习一个模式,花上一两个小时把此模式的意思理解了,就够了。其精华的所在会在以后工作的设计中逐渐体现出来。

#include <iostream>
#include "string"
using namespace std;

class House
{
public:
	void setDoor(string door)
	{
		this->m_door = door;
	}

	void setWall(string wall)
	{
		this->m_wall = wall;
	}

	void setWindow(string window)
	{
		this->m_window = window;
	}

	string getDoor()
	{
		cout << m_door << endl;
		return this->m_door;
	}

	string getWall()
	{
		cout << m_wall << endl;
		return this->m_wall;
	}

	string getWindow()
	{
		cout << m_window << endl;
		return m_window;
	}

private:
	string    m_door;
	string    m_wall;
	string    m_window;
};

class  Builder
{
public:
	virtual void buildWall() = 0;
	virtual void buildDoor() = 0;
	virtual void buildWindow() = 0;
	virtual House* getHouse() = 0;
};

//公寓工程队
class  FlatBuilder : public Builder
{
public:
	FlatBuilder()
	{
		m_house = new House;
	}

	virtual void buildWall()
	{
		m_house->setWall(" flat wall");
	}

	virtual void buildDoor()
	{
		m_house->setDoor("flat door");
	}

	virtual void buildWindow()
	{
		m_house->setWindow("flat window");
	}

	virtual House* getHouse()
	{
		return m_house;
	}
private:
	House *m_house;
};

//别墅villa工程队
class  VillaBuilder : public Builder
{
public:
	VillaBuilder()
	{
		m_house = new House;
	}

	virtual void buildWall()
	{
		m_house->setWall(" villa wall");
	}

	virtual void buildDoor()
	{
		m_house->setDoor("villa door");
	}

	virtual void buildWindow()
	{
		m_house->setWindow("villa window");
	}

	virtual House* getHouse()
	{
		return m_house;
	}
private:
	House *m_house;
};

//设计师(指挥者)负责建造逻辑  
//建筑队干具体的活
class Director
{
public:
	Director(Builder * build)
	{
		m_build = build;
	}
	void Construct()
	{
		m_build->buildWall();
		m_build->buildWindow();
		m_build->buildDoor();
	}
private:
	Builder * m_build;
};

void main()
{
	House        *house = NULL;
	Builder        *builder = NULL;
	Director    *director = NULL;

	// 请一个建造别墅的工程队
	builder = new VillaBuilder;

	//设计师 指挥 工程队 干活
	director = new Director(builder);
	director->Construct();
	house = builder->getHouse();
	house->getWindow();
	house->getDoor();

	delete house;
	delete builder;

	//请 FlatBuilder 公寓
	builder = new FlatBuilder;
	director = new Director(builder);
	director->Construct();
	house = builder->getHouse();
	house->getWindow();
	house->getDoor();
	delete house;
	delete builder;
	delete director;

	system("pause");
	return;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值