经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式-创建型-抽象工厂模式
来源:cnblogs  作者:酷学大叔  时间:2019/9/16 9:17:48  对本文有异议

  前一章节,我们介绍了简单工厂模式以及工厂方法模式,但是这两种模式都存在一定的局限性,只能生产某一类型下的某一种产品,如果需求变更,同类型下出现了不同的产品,比如芝士披萨不仅有口味上的不同,同时存在外观上的不同。这种时候,工厂模式显然不再满足要求,该怎么办呢?于是我们想到DIP原则,它不正是为了解决这种情况而存在的吗?接下来我们来介绍下抽象工厂模式:

  1、抽象工厂模式定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。

  2、抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。

  3、从设计层面来说,抽象工厂模式就是对简单工厂模式的改进(即进一步抽象化)

  4、将工厂抽象成两层,抽象工厂和具体的实现工厂。

还是拿pizza订购举例,我们定义一个抽象工厂AbsFactory,由子类工厂实现该抽象工厂;订购披萨OrderPizza依赖抽象,不依赖具体的实现。

   

  1. 1 internal class Program
  2. 2 {
  3. 3 private static void Main(string[] args)
  4. 4 {
  5. 5 new OrderPizza(new BJFactory());
  6. 6 }
  7. 7 }
  8. 8
  9. 9 internal class OrderPizza
  10. 10 {
  11. 11 private AbsFactory factory;
  12. 12
  13. 13 public OrderPizza(AbsFactory factory)
  14. 14 {
  15. 15 setFactory(factory);
  16. 16 Order();
  17. 17 }
  18. 18
  19. 19 private void setFactory(AbsFactory factory)
  20. 20 {
  21. 21 this.factory = factory;
  22. 22 }
  23. 23
  24. 24 private void Order()
  25. 25 {
  26. 26 Pizza pizza = null;
  27. 27 string orderType = "";
  28. 28 do
  29. 29 {
  30. 30 Console.Write("请输入订购类型:");
  31. 31 orderType = Console.ReadLine();
  32. 32 pizza = this.factory.createPizza(orderType);
  33. 33 if (pizza == null)
  34. 34 {
  35. 35 Console.WriteLine("订购失败");
  36. 36 break;
  37. 37 }
  38. 38 //开始制作
  39. 39 pizza.prepare();
  40. 40 pizza.bake();
  41. 41 pizza.cut();
  42. 42 pizza.box();
  43. 43 } while (true);
  44. 44 }
  45. 45 }
  46. 46
  47. 47 internal interface AbsFactory
  48. 48 {
  49. 49 Pizza createPizza(string orderType);
  50. 50 }
  51. 51
  52. 52 internal class BJFactory : AbsFactory
  53. 53 {
  54. 54 public Pizza createPizza(string orderType)
  55. 55 {
  56. 56 Pizza pizza = null;
  57. 57 if (orderType == "cheese")
  58. 58 {
  59. 59 pizza = new BJCheesePizza();
  60. 60 pizza.setName("北京芝士披萨");
  61. 61 }
  62. 62 else if (orderType == "greek")
  63. 63 {
  64. 64 pizza = new BJGreekPizza();
  65. 65 pizza.setName("北京希腊披萨");
  66. 66 }
  67. 67 return pizza;
  68. 68 }
  69. 69 }
  70. 70
  71. 71 internal class LDFactory : AbsFactory
  72. 72 {
  73. 73 public Pizza createPizza(string orderType)
  74. 74 {
  75. 75 Pizza pizza = null;
  76. 76 if (orderType == "cheese")
  77. 77 {
  78. 78 pizza = new LDCheesePizza();
  79. 79 pizza.setName("伦敦芝士披萨");
  80. 80 }
  81. 81 else if (orderType == "greek")
  82. 82 {
  83. 83 pizza = new LDGreekPizza();
  84. 84 pizza.setName("伦敦希腊披萨");
  85. 85 }
  86. 86 return pizza;
  87. 87 }
  88. 88 }
  89. 89
  90. 90 internal abstract class Pizza
  91. 91 {
  92. 92 private string name;
  93. 93
  94. 94 public abstract void prepare();
  95. 95
  96. 96 public void bake()
  97. 97 {
  98. 98 Console.WriteLine($"{this.name} 烘培");
  99. 99 }
  100. 100
  101. 101 public void cut()
  102. 102 {
  103. 103 Console.WriteLine($"{this.name} 修剪");
  104. 104 }
  105. 105
  106. 106 public void box()
  107. 107 {
  108. 108 Console.WriteLine($"{this.name} 打包");
  109. 109 }
  110. 110
  111. 111 public void setName(string name)
  112. 112 {
  113. 113 this.name = name;
  114. 114 }
  115. 115 }
  116. 116
  117. 117 internal class BJCheesePizza : Pizza
  118. 118 {
  119. 119 public override void prepare()
  120. 120 {
  121. 121 Console.WriteLine("北京的芝士披萨准备中");
  122. 122 }
  123. 123 }
  124. 124
  125. 125 internal class BJGreekPizza : Pizza
  126. 126 {
  127. 127 public override void prepare()
  128. 128 {
  129. 129 Console.WriteLine("北京的希腊披萨准备中");
  130. 130 }
  131. 131 }
  132. 132
  133. 133 internal class LDCheesePizza : Pizza
  134. 134 {
  135. 135 public override void prepare()
  136. 136 {
  137. 137 Console.WriteLine("伦敦的芝士披萨准备中");
  138. 138 }
  139. 139 }
  140. 140
  141. 141 internal class LDGreekPizza : Pizza
  142. 142 {
  143. 143 public override void prepare()
  144. 144 {
  145. 145 Console.WriteLine("伦敦的希腊披萨准备中");
  146. 146 }
  147. 147 }
view code

读过一些博主的博文以及评论,有一些理解还是蛮到位的:

  1、抽象工厂比工厂方法复杂的多,它们的目的不同。工厂方法意在延迟加载,而抽象方法意在高内聚低耦合。

  2、工厂方法模式的具体工厂类只能创建一个具体具体产品类的实例,而抽象工厂可以创建多个。

参考:https://www.runoob.com/design-pattern/abstract-factory-pattern.html

原文链接:http://www.cnblogs.com/az4215/p/11518442.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号