1.5建造者模式(创建)

说明:来源培训讲义资料

建造者模式

1、概念

  Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
  对象的创建:Builder模式是为对象的创建而设计的模式, 创建的是一个复合对象,被创建的对象为一个具有复合属性的复合对象- -关注对象创建的各部分的创建过程.
  不同的工厂(这里指builder生成器)对产品属性有不同的创建方法

2 、角色和职责

在这里插入图片描述

Builder
  为创建产品各个部分,统一抽象接口。
ConcreteBuilder
  具体的创建产品的各个部分,部分A, 部分B,部分C。创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
Director
  构造一个使用Builder接口的对象。
Product
  表示被构造的复杂对象。

3、适用情况:

  一个对象的构建比较复杂,将一个对象的构建(?)和对象的表示(?)进行分离。

4 、创建者模式和工厂模式的区别

  • Factory模式中:
    1、有一个抽象的工厂。
    2、实现一个具体的工厂—汽车工厂。
    3、工厂生产汽车A,得到汽车产品A。
    4、工厂生产汽车B,得到汽车产品B。
    这样做,实现了购买者和生产线的隔离。强调的是结果

  • Builder模式:
    1、引擎工厂生产引擎产品,得到汽车部件A。
    2、轮胎工厂生产轮子产品,得到汽车部件B。
    3、底盘工厂生产车身产品,得到汽车部件C。
    4、将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。
    5、将这个整体送到汽车组装工厂,得到一个汽车产品。
    这样做,目的是为了实现复杂对象生产线和其部件的解耦。强调的是过程

  • 两者的区别在于:
       Factory模式不考虑对象的组装过程,而直接生成一个我想要的对象。
      Builder模式先一个个的创建对象的每一个部件,再统一组装成一个对象。
      Factory模式所解决的问题是,工厂生产产品。
      而Builder模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品。
      Builder模式不是很常用。模式本身就是一种思想。知道了就可以了。
    设计模式就是一种思想。学习一个模式,花上一两个小时把此模式的意思理解了,就够了。其精华的所在会在工作的设计中逐渐体现出来。

5、案例

  • 关键字:
    建公寓工程队 FlatBuild
    别墅工程队 VillaBuild
    设计者Director
#include <iostream>
using namespace std;
#include "string"
class House
{
public:
	void setFloor(string floor){this->m_floor = floor;}
	void setWall(string wall){this->m_wall = wall;}
	void setDoor(string door){this->m_door = door;}
	
	string getFloor(){return m_floor;}
	string setWall(){return  m_wall;}
	string setDoor(){return m_door;}
private:
	string	m_floor;
	string	m_wall;
	string	m_door;
};

class Builder
{
public:
	virtual void makeFloor() = 0;
	virtual void makeWall() =  0;
	virtual void makeDoor() = 0;
	virtual House *GetHouse() = 0;
};

//公寓建造队
class FlatBuild : public Builder
{
public:
	FlatBuild(){pHouse = new House;}
	virtual void makeFloor(){pHouse->setFloor("flat Door");}
	virtual void makeWall(){pHouse->setWall("flat Wall");}
	virtual void makeDoor(){pHouse->setDoor("flat Door");}
	virtual House *GetHouse(){return pHouse;}
private:
	House *pHouse;
};

//别墅建造队
class VillaBuild : public Builder
{
public:
	VillaBuild(){pHouse = new House;}
	virtual void makeFloor(){pHouse->setFloor("villa floor");}
	virtual void makeWall(){pHouse->setWall("villa Wall");}
	virtual void makeDoor(){pHouse->setDoor("villa Door");}
	virtual House *GetHouse(){return pHouse;}
private:
	House *pHouse;
};
//指挥者
class Director
{
public:
	void Construct(Builder *builder)
	{
		builder->makeFloor();
		builder->makeWall();
		builder->makeDoor();
	}
};


void main()
{
	//客户直接造房子
	House *pHose = new House;
	pHose->setDoor("wbm门");
	pHose->setFloor("wbmFloor");
	pHose->setWall("wbmWall");
	delete pHose;
	/* //工程队直接造房子 
	Builder *builder = new FlatBuild;
	builder->makeFloor();
	builder->makeWall();
	builder->makeDoor();
	*/
	//指挥者(设计师)指挥 工程队 和 建房子
	Director *director = new Director;
	//建公寓
	Builder *builder = new FlatBuild;
	director->Construct(builder); //设计师 指挥 工程队干活
	House *house = builder->GetHouse();
	cout << house->getFloor() << endl;
	delete house;
	delete builder;

	//建别墅
	builder = new VillaBuild;
	director->Construct(builder); //设计师 指挥 工程队干活
	house = builder->GetHouse();
	cout << house->getFloor() << endl;
	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、付费专栏及课程。

余额充值