设计模式C++学习笔记之五(Factory Method工厂方法模式)
来源:互联网 发布:怎么处理文件集中 编程 编辑:程序博客网 时间:2024/05/29 15:47
转自 : http://www.cnblogs.com/wanggary/archive/2011/04/11/2013033.html
工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。这个例子更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。贴代码了。
5.1.解释
女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这个词被现代人滥用了。这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,太空是湛蓝的,水是清澈的, 空气是清新的,太美丽了,然后就待时间长了就有点寂寞了,没有动物,这些看的都是静态的东西呀,怎么办?
别忘了是神仙呀,没有办不到的事情,于是女娲就架起了八卦炉(技术语:建立工厂)开始创建人,具体过程是这样的:先是泥巴捏,然后放八卦炉里烤,再扔到地上成长,但是意外总是会产生的:
第一次烤泥人, 兹兹兹兹兹~~,感觉应该熟了,往地上一扔,biu~,一个白人诞生了,没烤熟!
第二次烤泥人,兹兹兹兹兹兹兹兹~~~,上次都没烤熟,这次多烤会儿,往地上一扔,嘿,熟过头了,黑人那!
第三次烤泥人,兹~兹~兹~兹~,一边烤一边看,嘿,正正好,Perfect ! 优品,黄色人种!【备注:RB 人不属于此列】
main(),女娲
IHuman,产品接口
CYellowHuman,产品之一
CWhiteHuman,产品之二
CBlackHuman,产品之三
IHumanFactory,工厂接口
CYellowHumanFactory,工厂之一
CWhiteHumanFactory,工厂之二
CBlackHumanFactory,工厂之三
看代码:
//IHuman.h
#pragma onceclass IHuman{public: IHuman(void) { } virtual ~IHuman(void) { } virtual void Laugh() = 0; virtual void Cry() = 0; virtual void Talk() = 0;};
//YellowHuman.h
#pragma once#include "ihuman.h"class CYellowHuman : public IHuman{public: CYellowHuman(void); ~CYellowHuman(void); void Laugh(); void Cry(); void Talk();};
//YellowHuman.cpp
#include "StdAfx.h"#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;}
//WhiteHuman.h
#pragma once#include "ihuman.h"class CWhiteHuman : public IHuman{public: CWhiteHuman(void); ~CWhiteHuman(void); void Laugh(); void Cry(); void Talk();};
//WhiteHuman.cpp
#include "StdAfx.h"#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;}
//BlackHuman.h
#pragma once#include "ihuman.h"class CBlackHuman : public IHuman{public: CBlackHuman(void); ~CBlackHuman(void); void Laugh(); void Cry(); void Talk();};
//BlackHuman.cpp
#include "StdAfx.h"#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;}
//IHumanFactory.h
#pragma once#include "IHuman.h"class IHumanFactory{public: IHumanFactory(void) { } virtual ~IHumanFactory(void) { } virtual IHuman * CreateHuman() = 0;};//YellowHuman.h
#pragma once#include "ihumanfactory.h"class CYellowHumanFactory : public IHumanFactory{public: CYellowHumanFactory(void); ~CYellowHumanFactory(void); virtual IHuman * CreateHuman(void);};
//YellowHumanFactory.cpp
#include "StdAfx.h"#include "YellowHumanFactory.h"#include "YellowHuman.h"CYellowHumanFactory::CYellowHumanFactory(void){}CYellowHumanFactory::~CYellowHumanFactory(void){}IHuman * CYellowHumanFactory::CreateHuman( void ){ return new CYellowHuman();}//WhiteHuman.h
#pragma once#include "ihumanfactory.h"class CWhiteHumanFactory : public IHumanFactory{public: CWhiteHumanFactory(void); ~CWhiteHumanFactory(void); virtual IHuman * CreateHuman(void);};//WhiteHumanFactory.cpp
#include "StdAfx.h"#include "WhiteHumanFactory.h"#include "WhiteHuman.h"CWhiteHumanFactory::CWhiteHumanFactory(void){}CWhiteHumanFactory::~CWhiteHumanFactory(void){}IHuman * CWhiteHumanFactory::CreateHuman( void ){ return new CWhiteHuman();}//BlackHuman.h
#pragma once#include "ihumanfactory.h"class CBlackHumanFactory : public IHumanFactory{public: CBlackHumanFactory(void); ~CBlackHumanFactory(void); virtual IHuman * CreateHuman();};//BlackHumanFactory.cpp
#include "StdAfx.h"#include "BlackHumanFactory.h"#include "BlackHuman.h"CBlackHumanFactory::CBlackHumanFactory(void){}CBlackHumanFactory::~CBlackHumanFactory(void){}IHuman * CBlackHumanFactory::CreateHuman(){ return new CBlackHuman();}
//FactoryMethod.cpp
// FactoryMethod.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"#include "IHuman.h"#include "YellowHuman.h"#include "WhiteHuman.h"#include "BlackHuman.h"#include "SimpleHumanFactory.h"#include "StandardHumanFactory.h"#include "IHumanFactory.h"#include "YellowHumanFactory.h"#include "WhiteHumanFactory.h"#include "BlackHumanFactory.h"#include <iostream>using std::cout;using std::endl;using std::string;void DoFactoryMethod1(){ cout << "----------第一批人是这样的:黄种人工厂来生产黄种人" << endl; IHumanFactory *pHumanFactory = new CYellowHumanFactory(); IHuman *pHuman = pHumanFactory->CreateHuman(); pHuman->Cry(); pHuman->Laugh(); pHuman->Talk(); delete pHuman; delete pHumanFactory;}void DoFactoryMethod2(){ cout << "----------第二批人是这样的:白种人工厂来生产白种人" << endl; IHumanFactory *pHumanFactory = new CWhiteHumanFactory(); IHuman *pHuman = pHumanFactory->CreateHuman(); pHuman->Cry(); pHuman->Laugh(); pHuman->Talk(); delete pHuman; delete pHumanFactory;}void DoFactoryMethod3(){ cout << "----------第一批人是这样的:黑种人工厂来生产黑种人" << endl; IHumanFactory *pHumanFactory = new CBlackHumanFactory(); IHuman *pHuman = pHumanFactory->CreateHuman(); pHuman->Cry(); pHuman->Laugh(); pHuman->Talk(); delete pHuman; delete pHumanFactory;}int _tmain(int argc, _TCHAR* argv[]){ //工厂方法 cout << "----------工厂方法:" << endl; DoFactoryMethod1(); DoFactoryMethod2(); DoFactoryMethod3(); _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF); _CrtDumpMemoryLeaks(); return 0;}
工厂方法属于创建型模式,适合于产品不太多的情况。产品如果很多,则需要用抽象工厂来实现。
0 0
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
- 设计模式之五:工厂方法模式(Factory Method)
- 设计模式学习笔记五(Factory Method 工厂方法模式)
- 设计模式学习笔记四:工厂方法(Factory Method)
- 设计模式笔记之工厂模式--工厂方法模式(Factory Method)
- 设计模式C++(Factory Method工厂方法模式)
- 【设计模式】学习笔记5:工厂模式(Factory Method)
- java设计模式学习 ----- 工厂方法模式(Factory Method)
- 设计模式学习与实践(五)----工厂方法模式(factory method)
- 设计模式学习笔记:factory method(工厂方法)
- 设计模式之Factory Method(工厂方法模式)
- 代码设计模式之工厂方法模式(Factory Method)
- Qt Creator在Windows上的调试器安装与配置
- 指定区间的素数统计的几种方法
- c++第四次实验
- android安全——Activity劫持的防范程序
- centos6.3下安装中文输入法
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
- 算法时间复杂度
- 直播攻略:网易视频云送上OBS直播完整版教程
- Linux 安装lxml及各种问题的解决
- Python -- 冒泡排序算法
- VS2013 MFC应用程序工程中文件的组成
- C ++第四次作业
- 蓝桥杯 幂一矩阵 2014年JavaB组决赛第5题
- GROUP BY与COUNT用法详解