工厂模式就是将一组有相同方法行为的类放在一起生成。通过工厂类可以确定要生成哪一个对象。与
此同时可以延迟对象生成,方便后续扩展和维护。
具体工厂类的抽象基类,定义了具体工厂类都实现的抽象方法。
class CFood { public: virtual ~CFood(){}; //所有工厂类都要实现的同一接口方法 virtual void MakeFood() = 0; protected: CFood(){}; };
具体工厂类,实现了抽象工厂类的共同接口
#ifndef CAppleH #define CAppleH #include<iostream> #include "CFood.h" using namespace std; //--------------------------------------------------------------------------- class CApple:public CFood { public: CApple(){}; ~CApple(){}; void MakeFood(){cout<<"I make apple"<<endl;}; private: }; #endif
#ifndef CBananaH #define CBananaH //--------------------------------------------------------------------------- #include<iostream> #include "CFood.h" using namespace std; //--------------------------------------------------------------------------- class CBanana:public CFood { public: CBanana(){}; ~CBanana(){}; void MakeFood(){cout<<"I make Banana"<<endl;}; private: }; #endif
工厂方法类,决定要实例化哪一个具体类
//--------------------------------------------------------------------------- #ifndef CFactoryClassH #define CFactoryClassH //--------------------------------------------------------------------------- #include "CApple.h" #include "CBanana.h" enum{apple,banana} FoodType; class CFactoryClass { public: CFactoryClass(){}; ~CFactoryClass(){}; CFood* MakeFood(enum FoodType eFoodType) { CFood *pCFood = NULL; switch(eFoodType) { case apple: pCFood = new CApple(); break; case banana: pCFood = new CBanana(); break; default: return NULL; } return pCFood; } } ; #endif
测试代码
//--------------------------------------------------------------------------- #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused #include "CFactoryClass.h" int main(int argc, char* argv[]) { CFactoryClass tCFactoryClass; CFood *pCFood = NULL; pCFood = tCFactoryClass.MakeFood(apple); pCFood->MakeFood(); if(NULL != pCFood) { delete pCFood; } pCFood = tCFactoryClass.MakeFood(banana); pCFood->MakeFood(); if(NULL != pCFood) { delete pCFood; } char c = getchar(); c = getchar(); return 0; }
本文出自 “风清扬song” 博客,请务必保留此出处http://2309998.blog.51cto.com/2299998/1387170
原文:http://2309998.blog.51cto.com/2299998/1387170