AbstractFactory抽象工厂模式
本文实现代码参照 博客:http://www.cnblogs.com/wanggary/archive/2011/04/13/2015288.html
本文参照网页 http://blog.csdn.net/zhengzhb/article/details/7359385/
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
类型:创建类模式
类图:
抽象工厂模式与工厂方法模式的区别
抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。
在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。我们依然拿生产汽车的例子来说明他们之间的区别。
在上面的类图中,两厢车和三厢车称为两个不同的等级结构;而2.0排量车和2.4排量车则称为两个不同的产品族。再具体一点,2.0排量两厢车和2.4排量两厢车属于同一个等级结构,2.0排量三厢车和2.4排量三厢车属于另一个等级结构;而2.0排量两厢车和2.0排量三厢车属于同一个产品族,2.4排量两厢车和2.4排量三厢车属于另一个产品族。
明白了等级结构和产品族的概念,就理解工厂方法模式和抽象工厂模式的区别了,如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。在本例中,如果一个工厂模式提供2.0排量两厢车和2.4排量两厢车,那么他属于工厂方法模式;如果一个工厂模式是提供2.4排量两厢车和2.4排量三厢车两个产品,那么这个工厂模式就是抽象工厂模式,因为他提供的产品是分属两个不同的等级结构。当然,如果一个工厂提供全部四种车型的产品,因为产品分属两个等级结构,他当然也属于抽象工厂模式了。
下面为例子为参照上面提到的博客,自己在本地用c++实现的
IHuman.h中定义了相关产品的类,包括 IHuman,CYellowHuman,CYellowFemleHuman,CYellowMaleHuman,CWhiteHuame,CWhiteFemaleHuman,CWgiteMaleHuman,CBackHuman,CBackFemaleHuman,CBackMaleHuman
#pragma once #include <iostream> using std::cout; using std::endl; class IHuman { public: IHuman(void); ~IHuman(void); virtual void Laugh() = 0; virtual void Cry() = 0; virtual void Talk() = 0; virtual void Sex() = 0; }; class CYellowHuman:public IHuman { public: CYellowHuman() { } ~CYellowHuman() { } void Laugh() { cout << "黄种人会大笑" << endl; } void Cry() { cout<< "黄种人会哭"<< endl; } void Talk() { cout << "黄种人会说话,一般说的是双字节"<< endl; } virtual void Sex() = 0; }; class CYellowFemleHuman:public CYellowHuman { public: CYellowFemleHuman() { } ~CYellowFemleHuman() { } void Sex() { cout<< "该黄种人性别为女"<< endl; } }; class CYellowMaleHuman:public CYellowHuman { public: CYellowMaleHuman() { } ~CYellowMaleHuman() { } void Sex() { cout << "改黄种人性别为男"<< endl; } }; class CWhiteHuame:public IHuman { public: CWhiteHuame() { } ~CWhiteHuame() { } void Laugh() { cout << "白种人会大笑"<< endl; } void Cry() { cout <<"白种人会哭"<< endl; } void Talk() { cout <<"白种人会说话,一般都是单音节"<< endl; } virtual void Sex() = 0; }; class CWhiteFemaleHuman:public CWhiteHuame { public: CWhiteFemaleHuman() { } ~CWhiteFemaleHuman() { } void Sex() { cout<<"该白种人性别为女"<<endl; } }; class CWgiteMaleHuman : public CWhiteHuame { public: CWgiteMaleHuman() { } ~CWgiteMaleHuman() { } void Sex() { cout <<"该白种人性别为男"<<endl; } }; class CBackHuman : public IHuman { public: CBackHuman() { } ~CBackHuman() { } void Laugh() { cout << "黑人会笑"<<endl; } void Cry() { cout <<"黑人会哭"<<endl; } void Talk() { cout<<"黑人可以说话,一般人听不懂"<<endl; } virtual void Sex() = 0; }; class CBackFemaleHuman :public CBackHuman { public: CBackFemaleHuman() { } ~CBackFemaleHuman() { } void Sex() { cout << "该黑人性别为女"<< endl; } }; class CBackMaleHuman : public CBackHuman { public: CBackMaleHuman() { } ~CBackMaleHuman() { } void Sex() { cout << "该黑人性别为男"<< endl; } };
IHumanFactory.h代码如下
#pragma once #include "IHuman.h" class IHumanFactory { public: IHumanFactory(void); ~IHumanFactory(void); virtual IHuman *CreateYellHuman() = 0; virtual IHuman *CreateWhiteHuman() = 0; virtual IHuman *CreateBlackHuman() = 0; }; template<class T> class CStandardHumanFactory:public IHumanFactory { public: CStandardHumanFactory() { } ~CStandardHumanFactory() { } IHuman *CreateHuman() { return new T; } }; template<class T> class CMaleHumanFactory : public CStandardHumanFactory<T> { public: CMaleHumanFactory(void); ~CMaleHumanFactory(void); IHuman * CreateYellowHuman(); IHuman * CreateWhiteHuman(); IHuman * CreateBlackHuman(); }; template<class T> class CFemaleHumanFactory : public CStandardHumanFactory<T> { public: CFemaleHumanFactory(void) { } ~CFemaleHumanFactory(void) { } IHuman * CreateYellowHuman() { return CreateHuman(); } IHuman * CreateWhiteHuman() { return CreateHuman(); } IHuman * CreateBlackHuman() { return CreateHuman(); } };
IHumanFactory.cpp代码如下
#include "stdafx.h" #include "IHumanFactory.h" template<class T> CMaleHumanFactory<T>::CMaleHumanFactory(void) { } template<class T> CMaleHumanFactory<T>::~CMaleHumanFactory(void) { } template<class T> IHuman * CMaleHumanFactory<T>::CreateYellowHuman() { return CreateHuman(); } template<class T> IHuman * CMaleHumanFactory<T>::CreateWhiteHuman() { return CreateHuman(); } template<class T> IHuman * CMaleHumanFactory<T>::CreateBlackHuman() { return CreateHuman(); }