【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 1959|回复: 0

[设计模式] 设计模式C++学习笔记之五(Factory Method工厂方法模式)

[复制链接]
发表于 2013-8-8 10:41:38 | 显示全部楼层 |阅读模式
工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。这个例子更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com。贴代码了。
5.1.解释

main(),女娲

IHuman,产品接口

CYellowHuman,产品之一

CWhiteHuman,产品之二

CBlackHuman,产品之三

IHumanFactory,工厂接口

CYellowHumanFactory,工厂之一

CWhiteHumanFactory,工厂之二

CBlackHumanFactory,工厂之三


看代码:
  1. //IHuman.h

  2. #pragma once
  3. class IHuman
  4. {
  5. public:
  6.     IHuman(void)
  7.     {
  8.     }
  9.     virtual ~IHuman(void)
  10.     {
  11.     }
  12.     virtual void Laugh() = 0;
  13.     virtual void Cry() = 0;
  14.     virtual void Talk() = 0;
  15. };
复制代码

  1. //YellowHuman.h

  2. #pragma once
  3. #include "ihuman.h"
  4. class CYellowHuman :
  5.     public IHuman
  6. {
  7. public:
  8.     CYellowHuman(void);
  9.     ~CYellowHuman(void);
  10.     void Laugh();
  11.     void Cry();
  12.     void Talk();
  13. };
复制代码

  1. //YellowHuman.cpp

  2. #include "StdAfx.h"
  3. #include "YellowHuman.h"
  4. #include <iostream>
  5. using std::cout;
  6. using std::endl;
  7. CYellowHuman::CYellowHuman(void)
  8. {
  9. }
  10. CYellowHuman::~CYellowHuman(void)
  11. {
  12. }
  13. void CYellowHuman::Cry()
  14. {
  15.     cout << "黄色人种会哭" << endl;
  16. }
  17. void CYellowHuman::Laugh()
  18. {
  19.     cout << "黄色人种会大笑,幸福呀!" << endl;
  20. }
  21. void CYellowHuman::Talk()
  22. {
  23.     cout << "黄色人种会说话,一般说的都是双字节" << endl;
  24. }
复制代码

  1. //WhiteHuman.h

  2. #pragma once
  3. #include "ihuman.h"
  4. class CWhiteHuman :
  5.     public IHuman
  6. {
  7. public:
  8.     CWhiteHuman(void);
  9.     ~CWhiteHuman(void);
  10.     void Laugh();
  11.     void Cry();
  12.     void Talk();
  13. };
复制代码

  1. //WhiteHuman.cpp

  2. #include "StdAfx.h"
  3. #include "WhiteHuman.h"
  4. #include <iostream>
  5. using std::cout;
  6. using std::endl;
  7. CWhiteHuman::CWhiteHuman(void)
  8. {
  9. }
  10. CWhiteHuman::~CWhiteHuman(void)
  11. {
  12. }
  13. void CWhiteHuman::Cry()
  14. {
  15.     cout << "白色人种会哭" << endl;
  16. }
  17. void CWhiteHuman::Laugh()
  18. {
  19.     cout << "白色人种会大笑,侵略的笑声" << endl;
  20. }
  21. void CWhiteHuman::Talk()
  22. {
  23.     cout << "白色人种会说话,一般都是单字节" << endl;
  24. }
复制代码

  1. //BlackHuman.h

  2. #pragma once
  3. #include "ihuman.h"
  4. class CBlackHuman :
  5.     public IHuman
  6. {
  7. public:
  8.     CBlackHuman(void);
  9.     ~CBlackHuman(void);
  10.     void Laugh();
  11.     void Cry();
  12.     void Talk();
  13. };
复制代码

  1. //BlackHuman.cpp

  2. #include "StdAfx.h"
  3. #include "BlackHuman.h"
  4. #include <iostream>
  5. using std::cout;
  6. using std::endl;
  7. CBlackHuman::CBlackHuman(void)
  8. {
  9. }
  10. CBlackHuman::~CBlackHuman(void)
  11. {
  12. }
  13. void CBlackHuman::Cry()
  14. {
  15.     cout << "黑人会哭" << endl;
  16. }
  17. void CBlackHuman::Laugh()
  18. {
  19.     cout << "黑人会笑" << endl;
  20. }
  21. void CBlackHuman::Talk()
  22. {
  23.     cout << "黑人可以说话,一般人听不懂" << endl;
  24. }
复制代码

  1. //IHumanFactory.h

  2. #pragma once
  3. #include "IHuman.h"
  4. class IHumanFactory
  5. {
  6. public:
  7.     IHumanFactory(void)
  8.     {
  9.     }
  10.     virtual ~IHumanFactory(void)
  11.     {
  12.     }
  13.     virtual IHuman * CreateHuman() = 0;
  14. };
复制代码

  1. //YellowHuman.h

  2. #pragma once
  3. #include "ihumanfactory.h"
  4. class CYellowHumanFactory :
  5.     public IHumanFactory
  6. {
  7. public:
  8.     CYellowHumanFactory(void);
  9.     ~CYellowHumanFactory(void);
  10.     virtual IHuman * CreateHuman(void);
  11. };
复制代码

  1. //YellowHumanFactory.cpp

  2. #include "StdAfx.h"
  3. #include "YellowHumanFactory.h"
  4. #include "YellowHuman.h"
  5. CYellowHumanFactory::CYellowHumanFactory(void)
  6. {
  7. }
  8. CYellowHumanFactory::~CYellowHumanFactory(void)
  9. {
  10. }
  11. IHuman * CYellowHumanFactory::CreateHuman( void )
  12. {
  13.     return new CYellowHuman();
  14. }
复制代码

  1. //WhiteHuman.h

  2. #pragma once
  3. #include "ihumanfactory.h"
  4. class CWhiteHumanFactory :
  5.     public IHumanFactory
  6. {
  7. public:
  8.     CWhiteHumanFactory(void);
  9.     ~CWhiteHumanFactory(void);
  10.     virtual IHuman * CreateHuman(void);
  11. };
复制代码

  1. //WhiteHumanFactory.cpp

  2. #include "StdAfx.h"
  3. #include "WhiteHumanFactory.h"
  4. #include "WhiteHuman.h"
  5. CWhiteHumanFactory::CWhiteHumanFactory(void)
  6. {
  7. }
  8. CWhiteHumanFactory::~CWhiteHumanFactory(void)
  9. {
  10. }
  11. IHuman * CWhiteHumanFactory::CreateHuman( void )
  12. {
  13.     return new CWhiteHuman();
  14. }

复制代码

  1. //BlackHuman.h

  2. #pragma once
  3. #include "ihumanfactory.h"
  4. class CBlackHumanFactory :
  5.     public IHumanFactory
  6. {
  7. public:
  8.     CBlackHumanFactory(void);
  9.     ~CBlackHumanFactory(void);
  10.     virtual IHuman * CreateHuman();
  11. };

复制代码

  1. //BlackHumanFactory.cpp

  2. #include "StdAfx.h"
  3. #include "BlackHumanFactory.h"
  4. #include "BlackHuman.h"
  5. CBlackHumanFactory::CBlackHumanFactory(void)
  6. {
  7. }
  8. CBlackHumanFactory::~CBlackHumanFactory(void)
  9. {
  10. }
  11. IHuman * CBlackHumanFactory::CreateHuman()
  12. {
  13.     return new CBlackHuman();
  14. }
复制代码

  1. //FactoryMethod.cpp

  2. // FactoryMethod.cpp : 定义控制台应用程序的入口点。
  3. //
  4. #include "stdafx.h"
  5. #include "IHuman.h"
  6. #include "YellowHuman.h"
  7. #include "WhiteHuman.h"
  8. #include "BlackHuman.h"
  9. #include "SimpleHumanFactory.h"
  10. #include "StandardHumanFactory.h"
  11. #include "IHumanFactory.h"
  12. #include "YellowHumanFactory.h"
  13. #include "WhiteHumanFactory.h"
  14. #include "BlackHumanFactory.h"
  15. #include <iostream>
  16. using std::cout;
  17. using std::endl;
  18. using std::string;
  19. void DoFactoryMethod1()
  20. {
  21.     cout << "----------第一批人是这样的:黄种人工厂来生产黄种人" << endl;
  22.     IHumanFactory *pHumanFactory = new CYellowHumanFactory();
  23.     IHuman *pHuman = pHumanFactory->CreateHuman();
  24.     pHuman->Cry();
  25.     pHuman->Laugh();
  26.     pHuman->Talk();
  27.     delete pHuman;
  28.     delete pHumanFactory;
  29. }
  30. void DoFactoryMethod2()
  31. {
  32.     cout << "----------第二批人是这样的:白种人工厂来生产白种人" << endl;
  33.     IHumanFactory *pHumanFactory = new CWhiteHumanFactory();
  34.     IHuman *pHuman = pHumanFactory->CreateHuman();
  35.     pHuman->Cry();
  36.     pHuman->Laugh();
  37.     pHuman->Talk();
  38.     delete pHuman;
  39.     delete pHumanFactory;
  40. }
  41. void DoFactoryMethod3()
  42. {
  43.     cout << "----------第一批人是这样的:黑种人工厂来生产黑种人" << endl;
  44.     IHumanFactory *pHumanFactory = new CBlackHumanFactory();
  45.     IHuman *pHuman = pHumanFactory->CreateHuman();
  46.     pHuman->Cry();
  47.     pHuman->Laugh();
  48.     pHuman->Talk();
  49.     delete pHuman;
  50.     delete pHumanFactory;
  51. }
  52. int _tmain(int argc, _TCHAR* argv[])
  53. {
  54.     //工厂方法
  55.     cout << "----------工厂方法:" << endl;
  56.     DoFactoryMethod1();
  57.     DoFactoryMethod2();
  58.     DoFactoryMethod3();
  59.    
  60.     _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
  61.     _CrtDumpMemoryLeaks();
  62.     return 0;
  63. }
复制代码

工厂方法属于创建型模式,适合于产品不太多的情况。产品如果很多,则需要用抽象工厂来实现。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 03:55

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表