设计模式_07 建造者模式(含 UML图 和 C++代码)

7. 建造者模式

7.1 概述

将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的对象。
在这里插入图片描述

7.2 结构

抽象建造者(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的对象部件的创建。
具体建造者(ConcreteBuilder):实现Builder接口,完成复杂对象的各个部分的具体创建方法。在构造过程完成后,提供产品的实例。
产品类:要创建的复杂对象。
指挥者类:调用具体建造者来创建复杂对象的各个组成部分。在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

7.2.1 UML结构图

在这里插入图片描述

7.3 实现

7.3.1 UML图

在这里插入图片描述

7.3.2 代码

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

//CPU类
class Cpu {
public:
	virtual void showCpu() {}
};

class IntelCpu : public Cpu {
public:
	void showCpu() {
		cout << "Intel CPU" << endl;
	}
};

class AmdCpu : public Cpu {
public:
	void showCpu() {
		cout << "AMD CPU" << endl;
	}
};

//内存类
class Memory {
public:
	virtual void showMemory() {}
};

class CorsairMemory : public Memory {
public:
	void showMemory() {
		cout << "海盗船内存条" << endl;
	}
};

class KingstonMemory : public Memory {
public:
	void showMemory() {
		cout << "金士顿内存条" << endl;
	}
};

//主板类
class Mainboard {
public:
	virtual void showMainboard () {}
};

class MsiMainboard : public Mainboard {
public:
	void showMainboard() {
		cout << "微星主板" << endl;
	}
};

class AsusMainboard : public Mainboard {
public:
	void showMainboard() {
		cout << "华硕主板" << endl;
	}
};

//电脑类
class Computer {
private:
	Cpu* cpu;
	Memory* memory;
	Mainboard* mainboard;
public:
	void setCpu(Cpu* cpu) {
		this->cpu = cpu;
	}
	void setMemory(Memory* memory) {
		this->memory = memory;
	}
	void setMainboard(Mainboard* mainboard) {
		this->mainboard = mainboard;
	}
	void getInformation() {
		this->mainboard->showMainboard();
		this->cpu->showCpu();
		this->memory->showMemory();
	}
};

//Builder类
class ComputerBuilder {
protected:
	Computer* computer = new Computer();
public:
	virtual void buildCpu() {}
	virtual void buildMemory() {}
	virtual void buildMainboard() {}
	virtual Computer* getComputer() {
		return this->computer;
	}
};

class MsiIntelComputerBuilder : public ComputerBuilder {
public:
	void buildCpu() {
		this->computer->setCpu(new IntelCpu());
	}
	void buildMemory() {
		this->computer->setMemory(new CorsairMemory());
	}
	void buildMainboard() {
		this->computer->setMainboard(new MsiMainboard());
	}
	Computer* getComputer() {
		buildCpu();
		buildMemory();
		buildMainboard();
		return this->computer;
	}
};

class AsusCmdComputerBuilder : public ComputerBuilder {
public:
	void buildCpu() {
		this->computer->setCpu(new AmdCpu());
	}
	void buildMemory() {
		this->computer->setMemory(new KingstonMemory());
	}
	void buildMainboard() {
		this->computer->setMainboard(new AsusMainboard());
	}
	Computer* getComputer() {
		buildCpu();
		buildMemory();
		buildMainboard();
		return this->computer;
	}
};

//Director类
class Director {
private:
	ComputerBuilder* builder;
public:
	Director(ComputerBuilder* builder) {
		this->builder = builder;
	}
	Computer* construct() {
		return builder->getComputer();
	}
};
int main() {
	Director* director = new Director(new MsiIntelComputerBuilder());
	Computer* computer = director->construct();
	computer->getInformation();
	director = new Director(new AsusCmdComputerBuilder());
	computer = director->construct();
	computer->getInformation();
	return 0;
}

7.4 优缺点

7.4.1 优点

封装性好,使用封装者模式可以有效的封装变化。在使用建造者模式的场景中一般产品类和建造者类是比较稳定的。因此,将主要的业务逻辑封装在指挥者类中对整体而言可以取得很好的稳定性。
客户端不需要知道产品内部的细节,将产品本身和产品创建过程解耦。
可以更加精细的控制产品的创建过程,将产品的创建步骤分解在不同的方法中。
很容易进行扩展,如果有新的需求,只需要创建一个新的建造者类就可以。基本不用修改之前测试过的代码。

7.4.2 缺点

建造者模式生产的产品一般具有较多的共同点,组成部分相似。如果产品差异大,则不适合用建造者模式。因此,适用范围有影响。

7.5 使用场景

创建对象较复杂,由多个部件构成,各部件种类繁多,但部件间的构造方式是稳定的。
创建复杂对象的算法独立于该对象的组成部分以及他们的装配方式,即产品的构建过程和最终表示是相互独立的。

7.6 模式扩展

当一个类构造器需要传入很多参数时,如果创建这个类的实例,可读性会很差,且容易引入错误。可以使用建造者类重构。

return 设计模式概述;

返回设计模式概述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值