抽象工厂模式是工厂方法模式的进一步强化。当工厂函数仅仅须要产生一种类型的产品(全部产品都继承自同一抽象基类)时,使用工厂方法模式就可以。

可是。当用户程序须要创建多种类型的产品,而这些产品又有一定的内在联系,那么就要用到抽象工厂模式了。抽象工厂模式的UML图例如以下所看到的:

AbstractProductA和AbstractProductB是两种不同类型的抽象产品,每种类中的抽象以下又有两种不同类型的实现。

两个详细的工厂ConcreteFactory1和ConcreteFactory2负责生产每种抽象产品下的一个详细产品。

这种关系看起来比較复杂,以下通过一个样例来说明。一下是用C++编写的模拟抽象工厂模式的样例。

  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. // 笔记本抽象类
  7. class Notebook {
  8. public:
  9. // 全部笔记本拥有的共同接口
  10. virtual void Work() = 0;
  11. };
  12.  
  13. // 华硕笔记本详细类
  14. class ASUSNotebook : public Notebook {
  15. public:
  16. void Work()
  17. {
  18. cout << "ASUS notebook working..." << endl;
  19. }
  20. };
  21.  
  22. // 联想笔记本详细类
  23. class LenovoNotebook : public Notebook {
  24. public:
  25. void Work()
  26. {
  27. cout << "Lenovo notebook working..." << endl;
  28. }
  29. };
  30.  
  31. // 台式机抽象类
  32. class Desktop {
  33. public:
  34. // 全部台式机拥有的共同接口
  35. virtual void Work() = 0;
  36. };
  37.  
  38. // 华硕台式机详细类
  39. class ASUSDesktop : public Desktop {
  40. public:
  41. void Work()
  42. {
  43. cout << "ASUS desktop working..." << endl;
  44. }
  45. };
  46.  
  47. // 联想台式机详细类
  48. class LenovoDesktop : public Desktop {
  49. public:
  50. void Work()
  51. {
  52. cout << "Lenovo desktop working..." << endl;
  53. }
  54. };
  55.  
  56. // 抽象工厂
  57. class AbstractFactory {
  58. public:
  59. virtual Notebook* CreateNotebook() = 0; // 生产台式机的接口
  60. virtual Desktop* CreateDesktop() = 0; // 生产笔记本的接口
  61. };
  62.  
  63. // 华硕工厂
  64. class FactoryOfASUS : public AbstractFactory {
  65. public:
  66. // 华硕生产的笔记本
  67. Notebook* CreateNotebook()
  68. {
  69. return new ASUSNotebook();
  70. }
  71.  
  72. // 华硕生产的台式机
  73. Desktop* CreateDesktop()
  74. {
  75. return new ASUSDesktop();
  76. }
  77. };
  78.  
  79. // 联想工厂
  80. class FactoryOfLenovo : public AbstractFactory {
  81. public:
  82. // 联想生产的台式机
  83. Notebook* CreateNotebook()
  84. {
  85. return new LenovoNotebook();
  86. }
  87.  
  88. // 联想生产的笔记本
  89. Desktop* CreateDesktop()
  90. {
  91. return new LenovoDesktop();
  92. }
  93. };
  94.  
  95. int main()
  96. {
  97. // 注意,用户仅仅拥有抽象接口
  98. AbstractFactory *factory = new FactoryOfASUS(); // 实例化生产华硕电脑的工厂
  99. //AbstractFactory *factory = new FactoryOfLenovo(); // 实例化生产联想电脑的工厂
  100.  
  101. // 抽象产品类。不同的品牌是通过多态性质体现的
  102. Notebook *myNotebook;
  103. Desktop *myDesktop;
  104.  
  105. myNotebook = factory->CreateNotebook();
  106. myDesktop = factory->CreateDesktop();
  107.  
  108. myNotebook->Work();
  109. myDesktop->Work();
  110.  
  111. // 别忘了删除指针
  112. delete factory;
  113. delete myNotebook;
  114. delete myDesktop;
  115.  
  116. system("pause");
  117. return 0;
  118. }

执行结果:

在这个样例中,有两类抽象产品:笔记本Notebook和台式机Desktop。在它们以下又相应了详细的品牌。到底产生哪类品牌的电脑是由详细的工厂对象完毕的。对于用户代码而言,它们仅仅须要实例化详细品牌的工厂,然后通过工厂产生Notebook和Desktop对象就可以。当用户须要更换品牌时,仅仅须要改动第97、99两行代码就可以,例如以下所看到的:

  1. //AbstractFactory *factory = new FactoryOfASUS(); // 实例化生产华硕电脑的工厂
  2. AbstractFactory *factory = new FactoryOfLenovo(); // 实例化生产联想电脑的工厂

改动后的执行结果:



抽象工厂模式的长处就是便于交换产品系列。在上面的样例中。仅仅须要改动一处用户代码便能够更换整个电脑产品系列的品牌。

其次,用户代码包括的都是指向抽象基类的指针,详细的产品通过多态性加以差别,这使得用户代码依赖于抽象接口而不依赖于详细的类,添加了代码的灵活度。

參考:

《大话设计模式》文章15章

版权声明:本文博客原创文章,博客,未经同意,不得转载。

【设计模式】Abstract Factory模式的更多相关文章

  1. 设计模式 - Abstract Factory模式(abstract factory pattern) 详细说明

    Abstract Factory模式(abstract factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/ ...

  2. 一天一个设计模式——Abstract Factory抽象工厂模式

    一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...

  3. 设计模式(3)-对象创建型模式-Abstract Factory模式

    1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: •  一个系统要独立于它的产品的创建. ...

  4. 设计模式初学者笔记:Abstract Factory模式

    首先啰嗦下创建迷宫所用的Room类.这个类并不直接保存Room四周的构造,而是通过MapSite* _sides[4]这个私有数组成员指向Room四周的构造.那么什么时候将四周构造直接放在Room中, ...

  5. 面向对象设计——抽象工厂(Abstract Factory)模式

    定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...

  6. Abstract Factory模式的几个要点

    1.如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式.这时候使用简单的静态工厂完全可以.2.“系列对象”指的是这些对象之间有相互依赖.或作用的关系3.Abs ...

  7. 简洁 Abstract Factory模式(3.1)

    镇楼 在某些书中使用了二维图说明抽象工厂模式.非常好,可是yqj2065不喜欢他们的产品族/产品等级,改成品牌/产品类型. 抽象工厂模式(abstract factory pattern)较工厂方法模 ...

  8. 设计模式之Factory模式(C++)

    Factory模式具有两大重要的功能: (1).定义创建对象的接口,封装了对象的创建: (2).使具体化类工作延迟到了子类中. //Product.h #ifndef _PRODUCT_H_ #def ...

  9. c++设计模式系列----factory模式

    问题: 假设我们要开发一个游戏--打怪物,首先,游戏有分等级,假设有初级,中级两个个等级(就不用flappy bird模式了,那个比较特殊,对一个玩家来说是难以具有持久吸引力的!),不同的等级怪物也是 ...

随机推荐

  1. java提高篇(七)-----详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  2. DMA为什么比轮询、中断方式性能要卓越非常多?(你不懂)

    本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/35735397 假设是计算机专业出身的同学,都听过一个 ...

  3. 如何使用autolayout的UIView加入动画

    hi,all: 在经过了一番犹豫之后,我决定将我自己做的这个小APP的源代码发布给大家: 其出发点是和大家一起学习iOS开发,仅供学习參考之用. 之前代码是托管与gitlab 上的.今天我将其pull ...

  4. EF6操作Sqlite数据库的项目兼容性问题

    vs2010无法正确打开2015创建的项目里面操作Sqlite数据库时使用EF6创建的edmx文件(会显示空白)   但是可以正常查询 vs2015无法正确打开2010创建的项目里面操作Sqlite数 ...

  5. 前端project师的修真秘籍(css、javascript和其他)

    以我的经验,大部分技术,熟读下列四类书籍就可以. 入门,用浅显的语言和方式讲述正确的道理和方法,如head first系列 全面,巨细无遗地探讨每一个细节,遇到疑难问题时往往能够在这里得到理论解答,如 ...

  6. Decorator模式设计模式

    装饰者模式定义:动态地将责任附加到对象上. 若要扩展功能.装饰者提供了比继续更有弹性的替代方案. 简单定义:包装一个对象.以提供新的行为. 装饰者模式能够有效应对类爆炸问题. OO原则: 对扩展开放, ...

  7. String.Format in Java and C#

    原文:String.Format in Java and C# JDK1.5中,String类新增了一个很有用的静态方法String.format(): format(Locale l, String ...

  8. main真正的形状函数

    我们经常使用的像 int main()这种形式,但main长身体机能完全到底是什么样子? 以下这个main函数的形式可能有些出乎我们的意料: int main(int argc, char *argv ...

  9. 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法(转)

    对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的 对每一个class只有一个thread可以执行synchronized static method ...

  10. HDU2451:Simple Addition Expression

    Problem Description A luxury yacht with 100 passengers on board is sailing on the sea in the twiligh ...