建造者模式(Builder Pattern)是一种创建型的设计模式,它将一个复杂对象的构建与它的表示分离,也就是复杂的构建隐藏起来,并且加以抽象。
它的好处是建造者独立,易扩展。而且便于控制细节风险。缺点是产品必须有共同点,范围有限制。如内部变化复杂,会有很多的建造类。
建造者模式中的所有角色如下:
产品类:
class ProductComputer{
private:string m_CPU;string m_RAM;string m_DISK;
public:ProductComputer(){cout<<"Constructor of Product"<cout<<"Destructor of Product"< 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
和SUB_SPLIT_LINE
,这个并不是必要的,你可以选择去掉:
#define SPLIT_LINE "============================="
#define SUB_SPLIT_LINE "-----------------------------"
创建者接口(抽象创建者):
class IBuilder
{
public:ProductComputer *m_product;
public:IBuilder(){cout<<"Constructor of Interface Builder"<cout<<"Destructor of Interface Builder"<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"<cout<<"Destructor of ConcreteBuilder"<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"<cout<<"Destructor of Director"<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
在看完上面代码后,我们应该对建造者模式有了一定了解,我们可以看出:建造者模式更加关注与零件装配的顺序。然而工厂模式不需要关注这么多,只需创建实例即可。
上一篇:开发微服务电商项目演示(三)