建造者模式

在这里插入图片描述

  1. Builder:为创建产品各个部分,统一抽象接口。
  2. ConcreteBuilder:具体的创建产品的各个部分,部分 A, 部分 B,部分 C。
  3. Director:构造一个使用 Builder 接口的对象。
  4. Product:表示被构造的复杂对象。
    ConcreteBuilder 创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,
    包括将这些部件装配成最终产品的接口。
    适用场景:
    一个对象的构建比较复杂,将一个对象的构建(?)和对象的表示(?)进行分离。
    创建者模式和工厂模式的区别
    Factory 模式中:
    1、有一个抽象的工厂。
    2、实现一个具体的工厂—汽车工厂。
    3、工厂生产汽车 A,得到汽车产品 A。
    4、工厂生产汽车 B,得到汽车产品 B。
    这样做,实现了购买者和生产线的隔离。强调的是结果。
    Builder 模式:
    1、引擎工厂生产引擎产品,得到汽车部件 A。
    2、轮胎工厂生产轮子产品,得到汽车部件 B。
    3、底盘工厂生产车身产品,得到汽车部件 C。
    4、将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。
    5、将这个整体送到汽车组装工厂,得到一个汽车产品。
    这样做,目的是为了实现复杂对象生产线和其部件的解耦。强调的是过程
    两者的区别在于:
    Factory 模式不考虑对象的组装过程,而直接生成一个我想要的对象。
    Builder 模式先一个个的创建对象的每一个部件,再统一组装成一个对象。
    Factory 模式所解决的问题是,工厂生产产品。而 Builder 模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品。
class Building {
public:
	void setFloor(string floor) {
		this->m_floor = floor;
	}
	string getFloor() {
		return m_floor;
	}
	void setWall(string wall) {
		this->m_wall = wall;
	}
	string getWall() {
		return m_wall;
	}
	void setDoor(string door) {
		this->m_door = door;
	}
	string getDoor() {
		return m_door;
	}
private:
	string m_floor;
	string m_wall;
	string m_door;
};

class Builder {
public:
	virtual void createFloor() = 0;
	virtual void createWall() = 0;
	virtual void createDoor() = 0;
	virtual Building* getBuilding() = 0;
};

class DepartmentBuilder : public Builder {
public:
	DepartmentBuilder() {
		m_building = new Building;
	}
	void createFloor() {
		m_building->setFloor("Department floor");
	}
	void createWall() {
		m_building->setWall("Department wall");
	}
	void createDoor() {
		m_building->setDoor("Department door");
	}
	Building* getBuilding() {
		return m_building;
	}
private:
	Building* m_building;

};
class VillaBuilder : public Builder {
public:
	VillaBuilder() {
		m_building = new Building;
	}
	void createFloor() {
		m_building->setFloor("Villa floor");
	}
	void createWall() {
		m_building->setWall("Villa wall");
	}
	void createDoor() {
		m_building->setDoor("Villa door");
	}
	Building* getBuilding() {
		return m_building;
	}
private:
	Building* m_building;

};

class Director {
public:
	Director(Builder* builder) {
		builder->createFloor();
		builder->createWall();
		builder->createDoor();
	}
};
int main() {
	Builder* builder = new VillaBuilder;
	Director* dir = new Director(builder);
	Building* building = builder->getBuilding();
	cout << "data: " << building->getFloor() << endl;
	delete building;
	delete dir;
	delete builder;
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值