#pragma once
#include <Windows.h>
#include <iostream>
using namespace std;
/*
建造者模式
要素:
(1)构建产品类Product,产品类实现具体制作的产品的各个组件。一般会有比较多的代码量。产品类可以是一个具体的类,也可以是抽象类。
(2)构建抽象建造者类IBuilder,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品
(3)从抽象建造者类派生建造者类,主要实现组建产品和返回组建好的产品
(4)构建导演类,将IBuilder类构建产品的过程进行封装
优点:
(1)建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。
(2)建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险
建造者模式与工厂模式的区别:
(7)
建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。
与工厂模式相比,建造者模式一般用来创建更为复杂的对象,将对象的创建过程独立出来组成一个新的类——导演类。
也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;
而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责
将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。
*/
class Product
{
public:
Product(){}
~Product(){}
private:
UINT uType;
string name;
public:
void setProductType(UINT uTypeParam){
this->uType = uTypeParam;
}
void setProductName(string& nameParam){
this->name.clear();
this->name.assign(nameParam);
}
void showProduct()
{
cout<<"type:"<<this->uType<<" name:"<<this->name.c_str()<<endl;
}
};
//
class IBuilder
{
public:
IBuilder(){}
~IBuilder(){}
public:
virtual void setPart(UINT uTypeParam,string& nameParam) = 0;
virtual Product* getProduct() = 0;
};
class concreateBuilder : public IBuilder
{
public:
concreateBuilder(){m_pProduct = new Product();}
~concreateBuilder(){
if (m_pProduct != NULL)
{
delete m_pProduct;
m_pProduct = NULL;
}
}
private:
Product *m_pProduct;
public:
virtual Product* getProduct(){
return m_pProduct;
}
virtual void setPart(UINT uTypeParam,string& nameParam)
{
m_pProduct->setProductType(uTypeParam);
m_pProduct->setProductName(nameParam);
}
};
//
class Director
{
public:
Director(){ m_pBuilder = new concreateBuilder();}
~Director(){
if (m_pBuilder != NULL)
{
delete m_pBuilder;
m_pBuilder = NULL;
}
}
private://
IBuilder *m_pBuilder;
public:
Product* CreateProduct(UINT uTypeParam,string& nameParam)
{
m_pBuilder->setPart(uTypeParam,nameParam);
return m_pBuilder->getProduct();
}
};
void main(void)
{
Director *pDirector = new Director;
string baoMaName("baoMa");
pDirector->CreateProduct(1,baoMaName)->showProduct();
string aoDiName("aoDi");
pDirector->CreateProduct(2,aoDiName)->showProduct();
string sAuto("aoTuo");
pDirector->CreateProduct(3,sAuto)->showProduct();
delete pDirector;
pDirector = NULL;
}
建造者模式
最新推荐文章于 2024-08-27 17:19:33 发布