【C++设计模式】建造者模式

#ifndef __BUILDER_H__
#define __BUILDER_H__

#include <string>

//【说明】
// 一个复杂对象的创建,其通常是由很多的子对象构成;建造者模式就提供了一种“封装机制”来将各个对象的变化隔离开,最终,组合成复杂对象的过程是不会变的。

//【定义】
// 建造者模式:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

//【角色】
// 1) 抽象建造者(Builder):给出一个抽象接口,规范建造者对于生产的产品的各个组成部分的建造。
// 2) 具体建造者(ConcreteBuilder):实现builder接口,针对不同的商业逻辑,具体化各对象部分的建造,最后返回一个建造好的产品。
// 3) 导演(Director):导演,顾名思义,负责规范流程之用。在指导中不涉及产品的创建,只负责保证复杂对象各部分被创建或按某种顺序创建。
// 4) 产品(Product):复杂对象。

//【意义】
// 使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。
// 建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。
// 导演并不知道自己使用的究竟是builder的哪个子类,只有不知道,子类才能替换,正是因为可替换,组件才有价值。

//【示例】:

//要建造的对象
class Computer
{
public:	
	void SetFactory(const std::string &factory);

	void SetCpu(const std::string &cpu);

	void SetMemory(int memory);

	void SetColor(const std::string &color);

	void Show();

private:
	std::string m_factory;
	std::string m_cpu;
	int         m_memory;
	std::string m_color;	
};

//构建者接口
class iComputerBuilder
{
public:
	iComputerBuilder(){ }

	virtual ~iComputerBuilder(){ }

	virtual void BuildFactory(const std::string &factory) = 0;

	virtual void BuildCpu(const std::string &cpu) = 0;

	virtual void BuildMemory(int memory) = 0;

	virtual void BuildColor(const std::string &color) = 0;	

	virtual Computer * GetComputer() = 0;

};

class ConcreteComputerBuilder : public iComputerBuilder
{
public:
	ConcreteComputerBuilder();

	~ConcreteComputerBuilder();

	virtual void BuildFactory(const std::string &factory);

	virtual void BuildCpu(const std::string &cpu);

	virtual void BuildMemory(int memory);

	virtual void BuildColor(const std::string &color);	

	virtual Computer * GetComputer();

private:
	Computer * m_computer;
};

class ComputerDirector
{
public:	

	void Construct(iComputerBuilder * builder);
};

void TestBuilder();


#endif

#include "AbstractFactory.h"

void ChinaProductA::PrintProductA()
{
	printf("Print ChinaProductA. \n");
}

void ChinaProductB::PrintProductB()
{
	printf("Print ChinaProductB. \n");
}

void AmericaProductA::PrintProductA()
{
	printf("Print AmericaProductA. \n");
}

void AmericaProductB::PrintProductB()
{
	printf("Print AmericaProductB. \n");
}

iProductA* ChinaFactory::CreateProductA()
{
	return new ChinaProductA();
}

iProductB* ChinaFactory::CreateProductB()
{
	return new ChinaProductB();
}

iProductA* AmericaFactory::CreateProductA()
{
	return new AmericaProductA();
}

iProductB* AmericaFactory::CreateProductB()
{
	return new AmericaProductB();
}

void TestAbstractFactory()
{
	iAbstractFactory *cf = new ChinaFactory();

	iProductA *ca = cf->CreateProductA();

	iProductB *cb = cf->CreateProductB();

	ca->PrintProductA();

	cb->PrintProductB();

	delete cf; 
	delete ca;
	delete cb;

	iAbstractFactory * af = new AmericaFactory();

	iProductA *aa = af->CreateProductA();

	iProductB *ab = af->CreateProductB();

	aa->PrintProductA();

	ab->PrintProductB();

	delete af; 
	delete aa;
	delete ab;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
建造者模式是一种创建型设计模式,它允许您创建不同类型的对象,而无需暴露对象的创建逻辑。它将对象的构建步骤分解为可重用的部分,并允许您按顺序执行它们。这使得您能够创建具有不同属性的对象,而无需编写大量的重复代码。 在建造者模式,有一个建造者类,它负责创建对象的特定部分,如电脑的CPU、内存和硬盘等。该类具有一个公共接口,该接口定义了每个部分的构建步骤。在构建步骤完成后,该类可以返回一个完整的对象。 建造者模式也包括一个指导者类,它负责调用建造者类的构建步骤,并按照正确的顺序执行它们。指导者类知道如何创建对象,但不知道如何创建对象的每个部分,因此它将这个工作委托给建造者类。 以下是一个简单的C++实现建造者模式的示例代码: ```cpp #include <iostream> #include <string> class Computer { public: void setCPU(const std::string& cpu) { m_cpu = cpu; } void setMemory(const std::string& memory) { m_memory = memory; } void setHardDisk(const std::string& hardDisk) { m_hardDisk = hardDisk; } void show() { std::cout << "CPU: " << m_cpu << std::endl; std::cout << "Memory: " << m_memory << std::endl; std::cout << "Hard Disk: " << m_hardDisk << std::endl; } private: std::string m_cpu; std::string m_memory; std::string m_hardDisk; }; class Builder { public: virtual ~Builder() {} virtual void buildCPU() = 0; virtual void buildMemory() = 0; virtual void buildHardDisk() = 0; virtual Computer* getResult() = 0; }; class Director { public: void setBuilder(Builder* builder) { m_builder = builder; } void construct() { m_builder->buildCPU(); m_builder->buildMemory(); m_builder->buildHardDisk(); } private: Builder* m_builder; }; class DesktopBuilder : public Builder { public: DesktopBuilder() { m_computer = new Computer; } ~DesktopBuilder() { delete m_computer; } void buildCPU() { m_computer->setCPU("Intel Core i7"); } void buildMemory() { m_computer->setMemory("16GB DDR4 RAM"); } void buildHardDisk() { m_computer->setHardDisk("2TB SATA Hard Disk"); } Computer* getResult() { return m_computer; } private: Computer* m_computer; }; int main() { Director director; DesktopBuilder desktopBuilder; director.setBuilder(&desktopBuilder); director.construct(); Computer* computer = desktopBuilder.getResult(); computer->show(); return 0; } ``` 在这个示例,我们创建了一个Computer类,它有三个成员变量:CPU、内存和硬盘。我们还创建了一个Builder类,它定义了创建Computer对象的构建步骤,并且为每个部分提供了一个抽象接口。我们还创建了一个Director类,它负责调用建造者类的构建步骤,并按照正确的顺序执行它们。 在具体的建造者实现,我们创建了一个DesktopBuilder类,它实现了Builder接口,并具有一个Computer成员变量。在DesktopBuilder类的构建步骤,我们设置了Computer对象的CPU、内存和硬盘。最后,我们返回一个完整的Computer对象。 在main函数,我们创建了一个Director对象,并将DesktopBuilder对象传递给setBuilder函数。然后我们调用construct函数,它将调用DesktopBuilder的构建步骤,并返回一个完整的Computer对象。我们最后打印出这个对象的属性,以验证它是否被正确构建。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值