[设计模式] 建造者模式

什么是建造者模式

建造者模式(Builder Pattern)是一种创建型的设计模式,它将一个复杂对象的构建与它的表示分离,也就是复杂的构建隐藏起来,并且加以抽象。

它的好处是建造者独立,易扩展。而且便于控制细节风险。缺点是产品必须有共同点,范围有限制。如内部变化复杂,会有很多的建造类。

建造者模式

建造者模式中的角色

建造者模式中的所有角色如下:

  • 产品(Product):产品是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。
  • 抽象建造者(Builder):抽象建造者为创建一个产品对象的各个部件指定抽象接口。
  • 具体建造者(ConcreteBuilder):具体建造者实现了抽象建造者接口,实现各个部件的构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
  • 指挥者(Director):指挥者负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可调用建造者对象的部件与装配方法,完成发展对象的建造。

UML类图

在这里插入图片描述

代码实现

产品类:

class ProductComputer{
private:
	string m_CPU;
	string m_RAM;
	string m_DISK;
public:
	ProductComputer(){
		cout<<"Constructor of Product"<<endl;
	}
	~ProductComputer(){
		cout<<"Destructor of Product"<<endl;
	}
public:
	void setCPU(string CPU){ 
		this->m_CPU = CPU;
	}
	void setRAM(string RAM){
		this->m_RAM = RAM;
	}
	void setDISK(string DISK){
		this->m_DISK = DISK; 
	}
	void showHW(){
		/* definition of split line:
			#define     SPLIT_LINE "============================="
			#define SUB_SPLIT_LINE "-----------------------------"
		*/
		cout<<SPLIT_LINE<<"\nComputer Hardware List:\n"<<SUB_SPLIT_LINE<<"\nCPU:  "<<m_CPU<<"\nRAM:  "<<m_RAM<<"\nDISK: "<<m_DISK<<endl<<SPLIT_LINE<<endl;
	}
};

其中在输出的时候,为了使输出更加清晰,我们定义了分隔线SPLIT_LINESUB_SPLIT_LINE,这个并不是必要的,你可以选择去掉:

#define     SPLIT_LINE "============================="
#define SUB_SPLIT_LINE "-----------------------------"

创建者接口(抽象创建者):

class IBuilder
{
public:
    ProductComputer *m_product;
public:
	IBuilder(){
		cout<<"Constructor of Interface Builder"<<endl;
		m_product = new ProductComputer();
	}
	~IBuilder(){
		cout<<"Destructor of Interface Builder"<<endl;
		if(m_product != nullptr){
			delete m_product;
			m_product = nullptr;
		}
	}
public:
    virtual void buildCPU () = 0;
    virtual void buildRAM () = 0;
    virtual void buildDISK() = 0;
    virtual ProductComputer* getProductPtr() = 0;
};

具体创建者:

class ConcreteBuilder: public IBuilder{
public:
	ConcreteBuilder(){
		cout<<"Constructor of ConcreteBuilder"<<endl;
	}
	~ConcreteBuilder(){
		cout<<"Destructor of ConcreteBuilder"<<endl;
	}
public:
	void buildCPU(){
		this->m_product->setCPU("Intel Core i7-13700KF");
	}
	void buildRAM(){
		this->m_product->setRAM("Kingston FURY 32GB DDR5");
	}
	void buildDISK(){
		this->m_product->setDISK("WD SSD M.2(NVMe) 500G");
	}
	ProductComputer* getProductPtr(){
		return m_product;
	}
};

指挥者类:

class Director{
private:
	IBuilder* m_builder;
public:
	Director(){
		cout<<"Constructor of Director"<<endl;
	}
	~Director(){
		cout<<"Destructor of Director"<<endl;
	}
public:
	void setBuilder(IBuilder* builder){
		this->m_builder = builder;
	}
	ProductComputer* construct(){
		m_builder->buildCPU();
		m_builder->buildRAM();
		m_builder->buildDISK();
		return m_builder->getProductPtr();
	}
};

主函数:

int main(){
	Director *director = new Director();
	IBuilder* builder = new ConcreteBuilder();
	director->setBuilder(builder);

	ProductComputer* computer = director->construct();
	computer->showHW();

	delete director;
	delete (ConcreteBuilder*)builder;//to free the interface and conreatebuilder
}

Notice
这里一定要注意对于创建者delete时需要使用下面这样:

delete (ConcreteBuilder*)builder;

否则的话只会析构Ibuilder而不会析构ConcreteBuilder

输出如下:

Constructor of Director
Constructor of Interface Builder
Constructor of Product
Constructor of ConcreteBuilder
=============================
Computer Hardware List:
-----------------------------
CPU:  Intel Core i7-13700KF
RAM:  Kingston FURY 32GB DDR5
DISK: WD SSD M.2(NVMe) 500G
=============================
Destructor of Director
Destructor of ConcreteBuilder
Destructor of Interface Builder
Destructor of Product

建造者模式与工厂模式的区别

在看完上面代码后,我们应该对建造者模式有了一定了解,我们可以看出:建造者模式更加关注与零件装配的顺序。然而工厂模式不需要关注这么多,只需创建实例即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,您可以参考以下代码: ``` public class Car { private String make; private String model; private int year; private String color; public static class Builder { private String make; private String model; private int year; private String color; public Builder(String make, String model, int year) { this.make = make; this.model = model; this.year = year; } public Builder setColor(String color) { this.color = color; return this; } public Car build() { Car car = new Car(); car.make = this.make; car.model = this.model; car.year = this.year; car.color = this.color; return car; } } private Car() { } @Override public String toString() { return year + " " + make + " " + model + " (" + color + ")"; } } ``` 在这个范例,我们定义了一个 `Car` 类,该类包含了一些基本的属性,例如制造商、型号、年份和颜色。我们使用了建造者模式来构造 `Car` 对象,其 `Builder` 类包含了与 `Car` 相同的属性。我们在 `Builder` 为颜色属性提供了一个 setter 方法,这样我们可以更轻松地设置颜色。最后,我们定义了一个 `Car` 的私有构造函数,该构造函数只能从 `Builder` 创建,以确保只有 `Builder` 可以正确构造 `Car` 对象。 使用建造者模式的好处是,它提供了更好的可读性和可维护性,因为我们可以将对象的构建过程拆分成多个步骤,并根据需要添加或修改这些步骤。此外,建造者模式还可以保证创建的对象是不可变的,从而提高了应用程序的安全性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

orbitgw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值