工厂模式分为3种,即简单工厂模式、工厂方法模式、抽象工厂模式,其实大同小异,总结下来就是:

简单工厂模式:一个工厂,多个产品。产品需要有一个虚基类。通过传入参数,生成具体产品对象,并利用基类指针指向此对象。通过工厂获取此虚基类指针,通过运行时多态,调用子类实现。

  1. // Factory.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <string>
  7. using namespace std;
  8. class Product
  9. {
  10. public:
  11. virtual void show() = ;
  12. };
  13. class Product_A:public Product
  14. {
  15. public:
  16. void show() override
  17. {
  18. cout<<"Product_A"<<endl;
  19. }
  20. };
  21. class Product_B:public Product
  22. {
  23. public:
  24. void show() override
  25. {
  26. cout<<"Product_B"<<endl;
  27. }
  28. };
  29. class Factory
  30. {
  31. public:
  32. Product* create(int i)
  33. {
  34. switch(i)
  35. {
  36. case :
  37. return new Product_A;
  38. break;
  39. case :
  40. return new Product_B;
  41. break;
  42. default:
  43. break;
  44. }
  45. }
  46. };
  47.  
  48. int _tmain(int argc, _TCHAR* argv[])
  49. {
  50. Factory *factory = new Factory();
  51. factory->create()->show();
  52. factory->create()->show();
  53. system("pause");
  54. return ;
  55. }

工厂方法模式:多个工厂,多个产品,每个产品对应于一个工厂。此时工厂和产品都是通过虚基类的方式构建。对于简单工厂模式,当要增加一个新产品时候,就需要在工厂类中修改代码,具体表现为多加一个参数,来识别新的产品类型。此时违反了对扩展开放,对修改关闭的原则。基于此,工厂方法模式应运而生。当增加一个新产品时,同时增加一个新工厂。增加新工厂属于扩展,不会修改以前工厂类和产品类的任何代码。可以看过多个独立的简单工厂模式构成了工厂方法模式。

  1. // FactoryM.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include<iostream>
  6. #include <string>
  7. using namespace std;
  8.  
  9. class Product
  10. {
  11. public:
  12. virtual void show() = ;
  13. };
  14. class Product_A:public Product
  15. {
  16. public:
  17. void show() override
  18. {
  19. cout<<"Product_A"<<endl;
  20. }
  21. };
  22. class Product_B:public Product
  23. {
  24. public:
  25. void show() override
  26. {
  27. cout<<"Product_B"<<endl;
  28. }
  29. };
  30.  
  31. class Factory
  32. {
  33. public:
  34. virtual Product* create()=;
  35. };
  36.  
  37. class Factory_A:public Factory
  38. {
  39. public:
  40. Product* create()
  41. {
  42. return new Product_A;
  43. }
  44. };
  45. class Factory_B:public Factory
  46. {
  47. public:
  48. Product* create()
  49. {
  50. return new Product_B;
  51. }
  52. };
  53.  
  54. int _tmain(int argc, _TCHAR* argv[])
  55. {
  56. Factory_A *product_a = new Factory_A();
  57. Factory_B *product_b = new Factory_B();
  58. product_a->create()->show();
  59. product_b->create()->show();
  60. system("pause");
  61. return ;
  62. }

抽象工厂模式:多个工厂,多个产品,并且每个产品可以包含多个型号。此时工厂和产品都是通过虚基类的方式构建。每一个工厂类可以生产同一个产品的多个型号。

  1. // FactoryMUL.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include<string>
  7. using namespace std;
  8.  
  9. class Product1
  10. {
  11. public:
  12. virtual void show() = ;
  13. };
  14. class Product_A1:public Product1
  15. {
  16. public:
  17. void show() override
  18. {
  19. cout<<"Product_A1"<<endl;
  20. }
  21. };
  22. class Product_B1:public Product1
  23. {
  24. public:
  25. void show() override
  26. {
  27. cout<<"Product_B1"<<endl;
  28. }
  29. };
  30. class Product2
  31. {
  32. public:
  33. virtual void show() = ;
  34. };
  35. class Product_A2:public Product2
  36. {
  37. public:
  38. void show() override
  39. {
  40. cout<<"Product_A2"<<endl;
  41. }
  42. };
  43. class Product_B2:public Product2
  44. {
  45. public:
  46. void show() override
  47. {
  48. cout<<"Product_B2"<<endl;
  49. }
  50. };
  51. class Factory
  52. {
  53. public:
  54. virtual Product1 *create1() = ;
  55. virtual Product2 *create2() = ;
  56. };
  57. class Factory_A
  58. {
  59. public:
  60. Product1 *create1(){ return new Product_A1;}
  61. Product2 *create2(){ return new Product_A2;}
  62. };
  63. class Factory_B
  64. {
  65. public:
  66. Product1 *create1(){ return new Product_B1;}
  67. Product2 *create2(){ return new Product_B2;}
  68. };
  69. int _tmain(int argc, _TCHAR* argv[])
  70. {
  71. Factory_A *factoryA = new Factory_A();
  72. factoryA->create1()->show();
  73. factoryA->create2()->show();
  74.  
  75. Factory_B *factoryB = new Factory_B();
  76. factoryB->create1()->show();
  77. factoryB->create2()->show();
  78. system("pause");
  79. return ;
  80. }

C++设计模式之-工厂模式的总结的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  5. 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...

  6. php设计模式:工厂模式

    php设计模式:工厂模式 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂模式实现: 工厂模式中任何创建对象的工厂类都要实现这个接口,实现接口的方法体中都要实现接口中的方法,它声明 ...

  7. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  8. java 设计模式之工厂模式与反射的结合

    工厂模式: /**  * @author Rollen-Holt 设计模式之 工厂模式  */   interface fruit{     public abstract void eat(); } ...

  9. C#学习之设计模式:工厂模式

    最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...

  10. [JS设计模式]:工厂模式(3)

    简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...

随机推荐

  1. ultraedit 查看文件

    转自:https://wenda.so.com/q/1481655902726192 1 UltraEdit在打开文件的时候,会对文件类型进行检查.如果是二进制文件,会自动转为16进制显示模式.如下图 ...

  2. 20145324 《Java程序设计》第7周学习总结

    20145324 <Java程序设计>第7周学习总结 教材学习内容总结 第十一章 1.静态sleep()用于流程暂停指定时间,单位是毫秒 2.一个Thread被标记为Daemon线程,在所 ...

  3. TCP/IP的相关协议

  4. OAuth客户端调用

    public class OAuthClientTest { private HttpClient _httpClient; public OAuthClientTest() { _httpClien ...

  5. Mybatis实现批量删除

    知识点:当传入参数为数组时,XX.xml文件中,标签为collection属性 参考博客:https://blog.csdn.net/javaee_sunny/article/details/5251 ...

  6. 使用commons-pool2改造APNs连接池

    最近公司很多人反应apns推送的消息很慢,有时候需要5.6分钟才收到消息,我检查了下日志发现确实存在这个问题. 我们使用的是 https://github.com/relayrides/pushy 这 ...

  7. 爬虫之Fiddler抓取HTTPS设置

    Fiddler抓取HTTPS设置 启动Fiddler,打开菜单栏中的 Tools > Telerik Fiddler Options,打开“Fiddler Options”对话框. 对Fiddl ...

  8. 2017 ACM/ICPC Asia Regional Qingdao Online - 1011 A Cubic number and A Cubic Number

    2017-09-17 17:12:11 writer:pprp 找规律,质数只有是两个相邻的立方数的差才能形成,公式就是3 * n * (n + 1) +1, 判断读入的数是不是满足 这次依然只是做了 ...

  9. Dancing Links DLX

    Dancing Links DLX Dancing Links 用来解精准覆盖问题. 精准覆盖问题有两种版本. 精准覆盖 : 给一个01矩阵,如何选出若干行,使得每列都有且仅有一个1. 可以求最少行数 ...

  10. redmine修改附件储存路径

    如果想把redmine 1.x.x 版本中的attachments files 放在自定义的目录(例如/home/darkofday/redmineAttachFile/).执行下列命令:cd /ho ...