设计模式(c++)笔记之二(AbstractFactory抽象工厂模式)
来源:互联网 发布:程序员笔记本推荐 知乎 编辑:程序博客网 时间:2024/06/04 20:05
一、简介:
抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合。
AbstractFactory 模式典型的结构图为:
图 2-1:AbstractFactory Pattern 结构图
AbstractFactory 模式关键就是将这一组对象的创建封装到一个用于创建对象的类
(ConcreteFactory)中,维护这样一个创建类总比维护n多相关对象的创建过程要简单的多。
二、实例
上一篇博文讲到女娲造人,人是造出来了,世界时热闹了,可是低头一看,都是清一色的类型,缺少关爱、仇恨、喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,Shit!忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类重新洗牌,准备重新开始制造人类。
由于先前的工作已经花费了很大的精力做为铺垫,也不想从头开始了,那先说人类(Product 产品类)怎么改吧,好,有了,给每个人类都加一个性别,然后再重新制造,这个问题解决了,那八卦炉怎么办?只有一个呀,要么生产出全都是男性,要不都是女性,那不行呀,有了,把已经有了一条生产线——八卦炉(工厂模式中的 Concrete Factory)拆开,于是女娲就使用了“八卦拷贝术”,把原先的八卦炉一个变两个,并且略加修改,就成了女性八卦炉(只生产女性,一个具体工厂的实现类)和男性八卦炉(只生产男性,又一个具体工厂的实现类),这个过程的类图如下:
注释:
main(),女娲
IHuman,产品接口
CYellowHuman,抽象产品之一
CYellowFemaleHuman,具体产品之一
CYellowMaleHuman,具体产品之二
CWhiteHuman,抽象产品之二
CWhiteFemaleHuman,具体产品之三
CWhiteMaleHuman,具体产品之四
CBlackHuman,抽象产品之三
CBlackFemaleHuman,具体产品之五
CBlackMaleHuman,具体产品之六
IHumanFactory,抽象工厂
CStandardHumanFactory,抽象工厂基类(此类可有可无)
CFemaleHumanFactory,工厂之一
CMaleHumanFactory,工厂之二
我的工程目录:
三、实现代码
产品接口类IHuman
IHuman.h
#ifndef __Factory__IHuman__#define __Factory__IHuman__class IHuman { public: IHuman(void) { } virtual ~IHuman(void) { } virtual void Laugh() = 0; virtual void Cry() = 0; virtual void Talk() = 0; virtual void Sex() = 0;};#endif /* defined(__Factory__IHuman__) */
黑种人抽象类BlackHuman
BlackHuman.h
#ifndef __Factory__BlackHuman__#define __Factory__BlackHuman__#include <iostream>#include "IHuman.h"class CBlackHuman :public IHuman{public: CBlackHuman(void); ~CBlackHuman(void); void Laugh(); void Cry(); void Talk(); virtual void Sex() = 0;};#endif /* defined(__Factory__BlackHuman__) */BlackHuman.cpp
#include "BlackHuman.h"#include <iostream>using std::cout;using std::endl;CBlackHuman::CBlackHuman(void){}CBlackHuman::~CBlackHuman(void){}void CBlackHuman::Cry(){ cout << "黑人会哭" << endl;}void CBlackHuman::Laugh(){ cout << "黑人会笑" << endl;}void CBlackHuman::Talk(){ cout << "黑人可以说话,一般人听不懂" << endl;}
黑种人(男)具体实现类BlackMaleHuman
BlackMaleHuman.h
#ifndef __AbstractFactory__BlackMaleHuman__#define __AbstractFactory__BlackMaleHuman__#include <iostream>#include "BlackHuman.h"using std::cout;using std::endl;class CBlackMaleHuman :public CBlackHuman{public: CBlackMaleHuman(void) { } ~CBlackMaleHuman(void) { } void Sex() { cout << "该黑种人的性别为男..." << endl; }};#endif /* defined(__AbstractFactory__BlackMaleHuman__) */
黑种人(女)具体实现类BlackFemaleHuman
BlackFemaleHuman.h
#ifndef __AbstractFactory__BlackFemaleHuman__#define __AbstractFactory__BlackFemaleHuman__#include <iostream>#include "BlackHuman.h"using std::cout;using std::endl;class CBlackFemaleHuman :public CBlackHuman{public: CBlackFemaleHuman(void) { } ~CBlackFemaleHuman(void) { } void Sex() { cout << "该黑种人的性别为女..." << endl; }};#endif /* defined(__AbstractFactory__BlackFemaleHuman__) */
白种人抽象类WhiteHuman
WhiteHuman.h
#ifndef __Factory__WhiteHuman__#define __Factory__WhiteHuman__#include "IHuman.h"class CWhiteHuman :public IHuman{public: CWhiteHuman(void); ~CWhiteHuman(void); void Laugh(); void Cry(); void Talk(); virtual void Sex() = 0;};#endif /* defined(__Factory__WhiteHuman__) */WhiteHuman.cpp
#include "WhiteHuman.h"#include <iostream>using std::cout;using std::endl;CWhiteHuman::CWhiteHuman(void){}CWhiteHuman::~CWhiteHuman(void){}void CWhiteHuman::Cry(){ cout << "白色人种会哭" << endl;}void CWhiteHuman::Laugh(){ cout << "白色人种会大笑,侵略的笑声" << endl;}void CWhiteHuman::Talk(){ cout << "白色人种会说话,一般都是单字节" << endl;}
白种人(男)具体实现类WhiteMaleHuman
WhiteMaleHuman.h
#ifndef __AbstractFactory__WhiteMaleHuman__#define __AbstractFactory__WhiteMaleHuman__#include <iostream>#include "WhiteHuman.h"using std::cout;using std::endl;class CWhiteMaleHuman :public CWhiteHuman{public: CWhiteMaleHuman(void) { } ~CWhiteMaleHuman(void) { } void Sex() { cout << "该白种人的性别为男..." << endl; }};#endif /* defined(__AbstractFactory__WhiteMaleHuman__) */
白种人(男)具体实现类WhiteFemaleHuman
WhiteFemaleHuman.h
#ifndef __AbstractFactory__WhiteFemaleHuman__#define __AbstractFactory__WhiteFemaleHuman__#include <iostream>#include "WhiteHuman.h"#include <iostream>using std::cout;using std::endl;class CWhiteFemaleHuman : public CWhiteHuman{public: CWhiteFemaleHuman(void) { } ~CWhiteFemaleHuman(void) { } void Sex() { cout << "该白种人的性别为女..." << endl; }};#endif /* defined(__AbstractFactory__WhiteFemaleHuman__) */
黄种人抽象类YellowHuman
YellowHuman.h
#ifndef __Factory__YellowHuman__#define __Factory__YellowHuman__#include "IHuman.h"class CYellowHuman :public IHuman{public: CYellowHuman(void); ~CYellowHuman(void); void Laugh(); void Cry(); void Talk(); virtual void Sex() = 0;};#endif /* defined(__Factory__YellowHuman__) */YellowHuman.cpp
#include "YellowHuman.h"#include <iostream>using std::cout;using std::endl;CYellowHuman::CYellowHuman(void){}CYellowHuman::~CYellowHuman(void){}void CYellowHuman::Cry(){ cout << "黄色人种会哭" << endl;}void CYellowHuman::Laugh(){ cout << "黄色人种会大笑,幸福呀!" << endl;}void CYellowHuman::Talk(){ cout << "黄色人种会说话,一般说的都是双字节" << endl;}
黄种人(男)具体实现类YellowMaleHuman
YellowMaleHuman.h
#ifndef __AbstractFactory__YellowMaleHuman__#define __AbstractFactory__YellowMaleHuman__#include "yellowhuman.h"#include <iostream>using std::cout;using std::endl;class CYellowMaleHuman :public CYellowHuman{public: CYellowMaleHuman(void) { } ~CYellowMaleHuman(void) { } void Sex() { cout << "该黄种人的性别为男..." << endl; }};#endif /* defined(__AbstractFactory__YellowMaleHuman__) */
黄种人(女)具体实现类YellowFemaleHuman
YellowFemaleHuman.h
#ifndef __AbstractFactory__YellowFemaleHuman__#define __AbstractFactory__YellowFemaleHuman__#include <iostream>#include "YellowHuman.h"using std::cout;using std::endl;class CYellowFemaleHuman :public CYellowHuman{public: CYellowFemaleHuman(void) { } ~CYellowFemaleHuman(void) { } void Sex() { cout << "该黄种人的性别为女..." << endl; }};#endif /* defined(__AbstractFactory__YellowFemaleHuman__) */
抽象工厂类IHumanFactory
IHumanFactory.h
#ifndef __AbstractFactory__IHumanFactory__#define __AbstractFactory__IHumanFactory__#include <iostream>#include "IHuman.h"class IHumanFactory{public: IHumanFactory(void){} virtual ~IHumanFactory(void){} virtual IHuman *CreateYellowHuman() = 0; virtual IHuman *CreateWhiteHuman() = 0; virtual IHuman *CreateBlackHuman() = 0;};#endif /* defined(__AbstractFactory__IHumanFactory__) */
抽象工厂基类(此类可有可无)CStandardHumanFactory
StandardHumanFactory.h
#ifndef __AbstractFactory__StandardHumanFactory__#define __AbstractFactory__StandardHumanFactory__#include <iostream>#include "IHumanFactory.h"#include "IHuman.h"template<class T>class CStandardHumanFactory:public IHumanFactory{public: CStandardHumanFactory(void) { } ~CStandardHumanFactory(void) { } IHuman * CreateHuman() { return new T; }};#endif /* defined(__AbstractFactory__StandardHumanFactory__) */
创造(男)工厂类MaleHumanFactory
MaleHumanFactory.h
#ifndef __AbstractFactory__MaleHumanFactory__#define __AbstractFactory__MaleHumanFactory__#include <iostream>#include "StandardHumanFactory.h"#include "IHumanFactory.h"template<class T>class CMaleHumanFactory:public CStandardHumanFactory<T> { public: CMaleHumanFactory(void); ~CMaleHumanFactory(void); IHuman *CreateYellowHuman(); IHuman *CreateWhiteHuman(); IHuman *CreateBlackHuman();};#endif /* defined(__AbstractFactory__MaleHumanFactory__) */MaleHumanFactory.cpp
#include "MaleHumanFactory.h"template<class T>CMaleHumanFactory<T>::CMaleHumanFactory(void){ }template<class T>CMaleHumanFactory<T>::~CMaleHumanFactory(void){}template<class T>IHuman * CMaleHumanFactory<T>::CreateYellowHuman(){ //return CreateHuman(); return CStandardHumanFactory<T>::CreateHuman();}template<class T>IHuman * CMaleHumanFactory<T>::CreateWhiteHuman(){ //return CreateHuman(); return CStandardHumanFactory<T>::CreateHuman();}template<class T>IHuman * CMaleHumanFactory<T>::CreateBlackHuman(){ // return CreateHuman(); return CStandardHumanFactory<T>::CreateHuman();}
创造(女)工厂类MaleHumanFactory
#ifndef __AbstractFactory__FemaleHumanFactory__#define __AbstractFactory__FemaleHumanFactory__#include <iostream>#include "standardhumanfactory.h"#include "IHuman.h"template<class T>class CFemaleHumanFactory:public CStandardHumanFactory<T> { public: CFemaleHumanFactory(void) { } ~CFemaleHumanFactory(void) { } IHuman * CreateYellowHuman() { return CStandardHumanFactory<T>::CreateHuman(); //return CreateHuman(); } IHuman * CreateWhiteHuman() { return CStandardHumanFactory<T>::CreateHuman(); // return CreateHuman(); } IHuman * CreateBlackHuman() { return CStandardHumanFactory<T>::CreateHuman(); //return CreateHuman(); }};#endif /* defined(__AbstractFactory__FemaleHumanFactory__) */
主类main.cpp
#include <stdio.h>#include "IHuman.h"#include "IHumanFactory.h"#include "FemaleHumanFactory.h"#include "MaleHumanFactory.h"#include "MaleHumanFactory.cpp"#include "YellowFemaleHuman.h"#include "YellowMaleHuman.h"#include "WhiteFemaleHuman.h"#include "WhiteMaleHuman.h"#include "BlackFemaleHuman.h"#include "BlackMaleHuman.h"void DoIt(){ IHumanFactory *pFemaleHumanFactory = new CFemaleHumanFactory<CYellowFemaleHuman>(); IHuman *pYellowFemaleHuman = pFemaleHumanFactory->CreateYellowHuman(); pYellowFemaleHuman->Cry(); pYellowFemaleHuman->Laugh(); pYellowFemaleHuman->Talk(); pYellowFemaleHuman->Sex(); delete pYellowFemaleHuman; delete pFemaleHumanFactory; IHumanFactory *pMaleHumanFactory = new CMaleHumanFactory<CYellowMaleHuman>(); IHuman *pYellowMaleHuman = pMaleHumanFactory->CreateYellowHuman(); pYellowMaleHuman->Cry(); pYellowMaleHuman->Laugh(); pYellowMaleHuman->Talk(); pYellowMaleHuman->Sex(); delete pYellowMaleHuman; delete pMaleHumanFactory;}int main(int argc, const char * argv[]){ DoIt(); // insert code here... printf("Hello, World!\n"); return 0;}
结果如下:
参考文献:《设计模式之禅》,《GoF_23种设计模式解析》
参考博客:http://www.cnblogs.com/wanggary/archive/2011/04/13/2015288.html
- 设计模式(c++)笔记之二(AbstractFactory抽象工厂模式)
- 设计模式实例(Lua)笔记之二(AbstractFactory抽象工厂模式)
- 设计模式之抽象工厂模式(AbstractFactory)
- 抽象工厂模式(AbstractFactory)-设计模式(二)
- 设计模式的实现(C++)------抽象工厂模式(AbstractFactory)
- Java设计模式之二:抽象工厂AbstractFactory
- 设计模式C++之七(AbstractFactory抽象工厂模式)
- 【2】设计模式之抽象工厂模式(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- 设计模式之AbstractFactory(抽象工厂)
- 设计模式之AbstractFactory(抽象工厂)
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- Android应用如何监听自己是否被卸载
- HTML5 Web app开发工具Kendo UI Web教程:如何配置Kendo UI Calendar
- HorizontalScrollView +viewpager 自动显示全第一个与最后一个
- OCP-1Z0-052-V8.02-144题
- decode('unicode_escape')
- 设计模式(c++)笔记之二(AbstractFactory抽象工厂模式)
- 求一个数组数据不在另一个数组中的数据
- Naive Bayesian classification
- POJ_1141_Brackets Sequence
- 【Tech-Android-Jni】在Ecplise中配置新的Run命令,用于生成.so文件
- 对as3数组进行group分组操作
- android下截屏
- 常见面试题排序算法(二)
- Bayesain Networks