假如我们想用同一个接口要创建不同的对象,这里比喻成一个“青年工厂”吧,该工厂可以生产以下3种青年:
- 普通青年
- 文艺青年
- 2B青年(因C++不允许以数字开头命名标识符,我改成SB青年吧)
工厂模式有3种:
- 简单工厂(它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类)
- 抽象工厂
- 工厂方式
简单工厂设计模式实现,比如某大学可以毕业这3种青年,缺点是如果有个其他类的青年,需要再修改工厂方法。
// FactotyModel.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <memory> class YoungMan { public: YoungMan(){}; virtual ~YoungMan(){}; virtual void talk() = 0; }; //普通青年 class butongyoungman : public YoungMan { public: butongyoungman(){}; virtual ~butongyoungman(){}; virtual void talk(); }; void butongyoungman::talk() { std::cout << "I am a 普通青年" << std::endl; } //文艺青年 class weyiyoungman : public YoungMan { public: weyiyoungman(){}; virtual ~weyiyoungman(){}; virtual void talk(); }; void weyiyoungman::talk() { std::cout << "I am a 文艺青年" << std::endl; } class SByoungman : public YoungMan { public: SByoungman(){}; virtual ~SByoungman(){}; virtual void talk(); }; void SByoungman::talk() { std::cout << "I am a 二逼青年" << std::endl; } enum YOUNGTYPE { kbutong = 0, kwenyi = 1, k2b = 2 }; //青年工厂 class youngmanFactory { public: youngmanFactory(){}; ~youngmanFactory(){}; static std::shared_ptr<YoungMan> CreateYoung(YOUNGTYPE ktype); private: }; std::shared_ptr<YoungMan> youngmanFactory::CreateYoung(YOUNGTYPE ktype) { switch (ktype) { case kbutong: return std::shared_ptr<YoungMan>(new butongyoungman); case kwenyi: return std::shared_ptr<YoungMan>(new weyiyoungman); case k2b: return std::shared_ptr<YoungMan>(new SByoungman); default: break; } } //main function int _tmain(int argc, _TCHAR* argv[]) { //YoungMan* btqn = youngmanFactory::CreateYoung(kbutong); std::shared_ptr<YoungMan> btqn = youngmanFactory::CreateYoung(kbutong); btqn->talk(); std::shared_ptr<YoungMan> wyqn = youngmanFactory::CreateYoung(kwenyi); wyqn->talk(); std::shared_ptr<YoungMan> sbqn = youngmanFactory::CreateYoung(k2b); sbqn->talk(); system("Pause"); return 0; }
不恶搞了,其他2种工厂方法的实现可以参考:http://blog.csdn.net/wuzhekai1985/article/details/6660462