设计模式之AbstractFactory模式【C++】
AbstractFactory模式结构图如下:

代码实现:
//ProductA.h #ifndef _PRODUCTA_H_ #define _PRODUCTA_H_ class ProductAAbs { public: virtual ~ProductAAbs(); virtual void OperateA()=0; protected: ProductAAbs(); private: }; class ProductAImpl1:public ProductAAbs { public: ProductAImpl1(); ~ProductAImpl1(); void OperateA(); protected: private: }; class ProductAImpl2:public ProductAAbs { public: ProductAImpl2(); ~ProductAImpl2(); void OperateA(); protected: private: }; #endif
//ProductA.cpp #include "ProductA.h" #include<iostream> using namespace std; //class ProductAAbs ProductAAbs::ProductAAbs() { } ProductAAbs::~ProductAAbs() { } //class ProductAImpl1 ProductAImpl1::ProductAImpl1() { cout<<"Construct of ProductAImpl1."<<endl; } ProductAImpl1::~ProductAImpl1() { cout<<"Destruct of ProductAImpl1."<<endl; } void ProductAImpl1::OperateA() { cout<<"OperateA of ProductAImpl1."<<endl; } //class ProductAImpl2 ProductAImpl2::ProductAImpl2() { cout<<"Construct of ProductAImpl2."<<endl; } ProductAImpl2::~ProductAImpl2() { cout<<"Destruct of ProductAImpl2."<<endl; } void ProductAImpl2::OperateA() { cout<<"OperateA of ProductAImpl2."<<endl; }
//ProductB.h #ifndef _PRODUCTB_H_ #define _PRODUCTB_H_ class ProductBAbs { public: virtual ~ProductBAbs(); virtual void OperateB()=0; protected: ProductBAbs(); private: }; class ProductBImpl1:public ProductBAbs { public: ProductBImpl1(); ~ProductBImpl1(); void OperateB(); protected: private: }; class ProductBImpl2:public ProductBAbs { public: ProductBImpl2(); ~ProductBImpl2(); void OperateB(); protected: private: }; #endif
//ProductB.cpp #include "ProductB.h" #include<iostream> using namespace std; //class ProductBAbs ProductBAbs::ProductBAbs() { } ProductBAbs::~ProductBAbs() { } //class ProductBImpl1 ProductBImpl1::ProductBImpl1() { cout<<"Construct of ProductBImpl1."<<endl; } ProductBImpl1::~ProductBImpl1() { cout<<"Destruct of ProductBImpl1."<<endl; } void ProductBImpl1::OperateB() { cout<<"OperateB of ProductBImpl1."<<endl; } //class ProductBImpl2 ProductBImpl2::ProductBImpl2() { cout<<"Construct of ProductBImpl2."<<endl; } ProductBImpl2::~ProductBImpl2() { cout<<"Destruct of ProductBImpl2."<<endl; } void ProductBImpl2::OperateB() { cout<<"OperateB of ProductBImpl2."<<endl; }
//AbstractFactory.h #ifndef _ABSTRACTFACTORY_H_ #define _ABSTRACTFACTORY_H_ enum ID_PRODUCTIMPL { ID_PRODUCTIMPL_1, ID_PRODUCTIMPL_2 }; class ProductAAbs; class ProductBAbs; class AbstractFactoryAbs { public: virtual ~AbstractFactoryAbs(); virtual ProductAAbs * CreateProductA(ID_PRODUCTIMPL id)=0; virtual ProductBAbs * CreateProductB(ID_PRODUCTIMPL id)=0; protected: AbstractFactoryAbs(); private: }; class AbstractFactoryImpl:public AbstractFactoryAbs { public: AbstractFactoryImpl(); ~AbstractFactoryImpl(); ProductAAbs * CreateProductA(ID_PRODUCTIMPL id); ProductBAbs * CreateProductB(ID_PRODUCTIMPL id); protected: private: }; #endif
//AbstractFactory.cpp #include "ProductA.h" #include "ProductB.h" #include "AbstractFactory.h" //class AbstractFactoryAbs AbstractFactoryAbs::AbstractFactoryAbs() { } AbstractFactoryAbs::~AbstractFactoryAbs() { } //class AbstractFactoryImpl AbstractFactoryImpl::AbstractFactoryImpl() { } AbstractFactoryImpl::~AbstractFactoryImpl() { } ProductAAbs * AbstractFactoryImpl::CreateProductA(ID_PRODUCTIMPL id) { switch(id) { case ID_PRODUCTIMPL_1: return new ProductAImpl1(); case ID_PRODUCTIMPL_2: return new ProductAImpl2(); default: return 0; } } ProductBAbs * AbstractFactoryImpl::CreateProductB(ID_PRODUCTIMPL id) { switch(id) { case ID_PRODUCTIMPL_1: return new ProductBImpl1(); case ID_PRODUCTIMPL_2: return new ProductBImpl2(); default: return 0; } }
//Test.cpp #include "ProductA.h" #include "ProductB.h" #include "AbstractFactory.h" #include<iostream> using namespace std; void main() { AbstractFactoryAbs * factory=new AbstractFactoryImpl(); ProductAAbs * productA=NULL; ProductBAbs * productB=NULL; if(productA!=NULL) { delete productA; productA=NULL; } productA=factory->CreateProductA(ID_PRODUCTIMPL_1); productA->OperateA(); if(productB!=NULL) { delete productB; productB=NULL; } productB=factory->CreateProductB(ID_PRODUCTIMPL_1); productB->OperateB(); if(productA!=NULL) { delete productA; productA=NULL; } productA=factory->CreateProductA(ID_PRODUCTIMPL_2); productA->OperateA(); if(productB!=NULL) { delete productB; productB=NULL; } productB=factory->CreateProductB(ID_PRODUCTIMPL_2); productB->OperateB(); if(productA!=NULL) { delete productA; productA=NULL; } if(productB!=NULL) { delete productB; productB=NULL; } if(factory!=NULL) { delete factory; factory=NULL; } }
posted on 2013-11-06 11:44 Anonymous_ 阅读(196) 评论(0) 收藏 举报
浙公网安备 33010602011771号