文章目录
- 什么是建造者模式
- 建造者模式
- 建造者模式中的角色
- UML类图
- 代码实现
- 建造者模式与工厂模式的区别
什么是建造者模式
建造者模式(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_LINE
和SUB_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
建造者模式与工厂模式的区别
在看完上面代码后,我们应该对建造者模式有了一定了解,我们可以看出:建造者模式更加关注与零件装配的顺序。然而工厂模式不需要关注这么多,只需创建实例即可。