【设计模式】工厂方法模式
2014-05-19 22:41
302 查看
工厂方法模式
本例以女娲娘娘造人为例,这个创意是从别处看来的,没体具体看人家的代码,觉得这个例子的创意很好,觉得很有意思,于是就拿过来一用。
前面所述,一个工厂子类对应一个功能子类,其功能仅仅是用来实例化相应的功能子类。
这里的工厂父类是INvWaFactory,女娲娘娘工厂,因为功能类的抽象基类是IHuman(人类),人类有三个子类(白人、黑人、黄人),因此女娲娘娘工厂父类也有三个工厂子类,其作用是分别实例化白人类、黑人类、黄人类。
在女娲娘娘工厂类继承体系中,有一个虚函数CreateInstance,这个虚函数用来实例化不同的人类子类,并且返回人类抽象基类的指针。
两次多态:①根据需要去实例化不同的工厂子类,将该工厂子类指针赋值给女娲娘娘工厂抽象基类指针,然后用此指针去调用相应的CreateInstance虚函数。
②将CreateInstance虚函数的返回值赋值给IHuman人类类抽象基类指针,用此指针去调用IHuman人类继承体系中的ShowSkin虚函数。
下面是工厂类继承结构
main函数及执行结果
/************************************************************************ 设计模式 工厂方法模式 在简单工厂里,工厂类的职责是根据不同的输入去实例化不同的类对象(实例化不同 类对象的代码是在一个工厂类中),作为客户端来说,所要做的就是根据需要来为 简单工厂传递不同的参数,当有新的需求增加时,需要再增加一个功能类的同时, 需要去修改简单工厂总根据输入实例化不同类的代码,在之前说过,这违反了开闭原则, 就是多当要扩展了时必须要修改代码。 在工厂类中一般是在其构造函数中实例化不同 的功能类。 在工厂方式模式中,两次用到了多态机制。 工厂方法模式中,有一个工厂类的(抽象)基类,工厂基类的每个子类的作用是实例化 不同的功能类(对象), 一个功能类对应一个工厂子类,一一对应,每个工厂类需要 继承重写的(虚)方法用来创建不同的功能类对象。 这一点也不同于简单工厂模式中的 在其构造函数中实例化不同类对象。 客户端根据需要去实例化不同的工厂子类,其返回值赋给工厂(抽象)父类对象(多态1), 然后该工厂(抽象)父类对象去调用创建(实例化)功能类对象的方法,将其返回值赋值给 功能类(抽象)父类对象(多态2),然后用该功能类(抽象)父类对象去调用相应的(虚)函数。 从而完成不同的操作。 ************************************************************************/
本例以女娲娘娘造人为例,这个创意是从别处看来的,没体具体看人家的代码,觉得这个例子的创意很好,觉得很有意思,于是就拿过来一用。
前面所述,一个工厂子类对应一个功能子类,其功能仅仅是用来实例化相应的功能子类。
这里的工厂父类是INvWaFactory,女娲娘娘工厂,因为功能类的抽象基类是IHuman(人类),人类有三个子类(白人、黑人、黄人),因此女娲娘娘工厂父类也有三个工厂子类,其作用是分别实例化白人类、黑人类、黄人类。
在女娲娘娘工厂类继承体系中,有一个虚函数CreateInstance,这个虚函数用来实例化不同的人类子类,并且返回人类抽象基类的指针。
两次多态:①根据需要去实例化不同的工厂子类,将该工厂子类指针赋值给女娲娘娘工厂抽象基类指针,然后用此指针去调用相应的CreateInstance虚函数。
②将CreateInstance虚函数的返回值赋值给IHuman人类类抽象基类指针,用此指针去调用IHuman人类继承体系中的ShowSkin虚函数。
//人类 类,抽象基类 class IHuman { public: IHuman(); virtual ~IHuman(); virtual void ShowSkin() const = 0; //显示肤色 }; IHuman::IHuman(){} IHuman::~IHuman(){} void IHuman::ShowSkin() const {} ////////////////////////////////////////////////////////////////////////// //白人类 class White : public IHuman { public: White(); virtual ~White(); virtual void ShowSkin() const; }; White::White(){} White::~White(){} void White::ShowSkin() const { cout << "我是白人,我的肤色是白色!\r\n"; } ////////////////////////////////////////////////////////////////////////// //黑人类 class Black : public IHuman { public: Black(); virtual ~Black(); virtual void ShowSkin() const; }; Black::Black(){} Black::~Black(){} void Black::ShowSkin() const { cout << "我是黑人,我的肤色是黑色\r\n"; } ////////////////////////////////////////////////////////////////////////// //黄人类 class Yellow : public IHuman { public: Yellow(); virtual ~Yellow(); virtual void ShowSkin() const; }; Yellow::Yellow(){} Yellow::~Yellow(){} void Yellow::ShowSkin() const { cout << "我是黄种人,我的肤色是黄色\r\n"; } //////////////////////////////////////////////////////////////////////////
下面是工厂类继承结构
class INvWaFactory //女娲工厂抽象基类 { public: INvWaFactory(); virtual ~INvWaFactory(); virtual IHuman* CreateInstance() = 0; //创建不同的功能子类 protected: IHuman* m_ptrHuman; }; INvWaFactory::INvWaFactory() { m_ptrHuman = NULL;} INvWaFactory::~INvWaFactory(){ } IHuman* INvWaFactory::CreateInstance() {return NULL;} ////////////////////////////////////////////////////////////////////////// //造白人类 class CMakeWhite : public INvWaFactory { public: CMakeWhite(); virtual ~CMakeWhite(); virtual IHuman* CreateInstance() ; }; CMakeWhite::CMakeWhite(){} CMakeWhite::~CMakeWhite(){delete m_ptrHuman;} IHuman* CMakeWhite::CreateInstance() { return (m_ptrHuman = new White()); } //////////////////////////////////////////////////////////////////////////// //造黑人类 class CMakeBlack : public INvWaFactory { public: CMakeBlack(); virtual ~CMakeBlack(); virtual IHuman* CreateInstance(); }; CMakeBlack::CMakeBlack(){} CMakeBlack::~CMakeBlack(){delete m_ptrHuman;} IHuman* CMakeBlack::CreateInstance() { return (m_ptrHuman = new Black()); } ////////////////////////////////////////////////////////////////////////// //造黄种人 class CMakeYellow : public INvWaFactory { public: CMakeYellow(); virtual ~CMakeYellow(); virtual IHuman* CreateInstance(); }; CMakeYellow::CMakeYellow(){} CMakeYellow::~CMakeYellow(){delete m_ptrHuman;} IHuman* CMakeYellow::CreateInstance() { return (m_ptrHuman = new Yellow()); }
main函数及执行结果
int _tmain(int argc, _TCHAR* argv[]) { INvWaFactory* pNvwaFactor = new CMakeWhite(); IHuman* pHuman = pNvwaFactor->CreateInstance(); pHuman->ShowSkin(); delete pNvwaFactor; cout<<endl; pNvwaFactor = new CMakeBlack(); pHuman = pNvwaFactor->CreateInstance(); pHuman->ShowSkin(); delete pNvwaFactor; cout<<endl; pNvwaFactor = new CMakeYellow(); pHuman = pNvwaFactor->CreateInstance(); pHuman->ShowSkin(); delete pNvwaFactor; cout<<endl<<endl; return 0; }
相关文章推荐
- 解读设计模式----工厂方法模式(FactoryMethod Pattern)
- 设计模式——工厂方法模式(Factory Method)
- 学习设计模式之旅之 工厂方法模式 推荐
- 我读设计模式之工厂方法模式
- AspectJ实现设计模式(三)——工厂方法模式
- 《星际争霸》与设计模式(2)——工厂方法模式
- 设计模式(Design Patterns)--工厂方法模式(Factory Method)
- .NET设计模式---工厂方法模式
- 设计模式学习-工厂方法模式
- .NET设计模式(5):工厂方法模式(Factory Method)
- 设计模式C#描述——工厂方法模式
- .NET设计模式-工厂方法模式
- 设计模式C#描述——工厂方法模式 mutou23 [原作]
- C#设计模式之工厂方法模式(游泳成绩排名例子)
- .NET设计模式之工厂方法模式
- Dot Net设计模式—工厂方法模式
- .Net设计模式学习笔记(五):工厂方法模式(Factory Method)
- 设计模式C#描述——工厂方法模式
- 设计模式学习--工厂方法模式
- AspectJ实现设计模式(三)——工厂方法模式