php设计模式之抽象工厂模式

刺骨的言语ヽ痛彻心扉 2021-09-17 13:52 424阅读 0赞

php设计模式之抽象工厂模式

【概要】
创建型模式
抽象工厂模式提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类【GOF95】
【特点】
抽象工厂模式(Abstact Factory)是一种常见的软件设计模式。该模式为一个产品族提供了统一的创建接口。当需要这个产品族的某一系列的时候,可以为此系列的产品族创建一个具体的工厂类。
【结构图】

看类图就清晰了
0_1324362250CZG9.gif

我这里方便创建紫色动物工厂,但是每个工厂里面还是只有猫和狗。就是我方便增加颜色工厂,但是我工厂里面的东西是固定的。
【主要角色】
抽象工厂(Abstract Factory)角色:它声明一个创建抽象产品对象的接口。通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类。
具体工厂(Concrete Factory)角色:实现创建产品对象的操作。客户端直接调用这个角色创建产品的实例。这个角色包含有选择合适的产品对象的逻辑。通常使用具体类实现。
抽象产品(Abstract Product)角色:声明一类产品的接口。它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,定义一个将被相应的具体工厂创建的产品对象。其内部包含了应用程序的业务逻辑。
【优缺点】
抽象工厂模式的优点:
1、分离了具体的类
2、使增加或替换产品族变得容易
3、有利于产品的一致性

抽象工厂模式的缺点:
难以支持新种类的产品。这是因为AbstractFactory接口确定了可以被创建的产品集合。支持新各类的产品就需要扩展访工厂接口,从而导致AbstractFactory类及其所有子类的改变。
抽象工厂就是以一种倾斜的方式支持增加新的产品中,它为新产品族的增加提供了方便,而不能为新的产品等级结构的增加提供这样的方便
【适用性】
1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
2、这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
3、 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使用客户端不依赖于实现

【抽象工厂模式php实例】

  1. 1 <?php
  2. 2 /**
  3. 3 * 抽象工厂模式
  4. 4 * -------------
  5. 5 * @author zhaoxuejie <zxj198468@gmail.com>
  6. 6 * @package design pattern
  7. 7 * @version v1.0 2011-12-14
  8. 8 */
  9. 9
  10. 10 //抽象工厂
  11. 11 interface AnimalFactory {
  12. 12
  13. 13 public function createCat();
  14. 14 public function createDog();
  15. 15
  16. 16 }
  17. 17
  18. 18 //具体工厂
  19. 19 class BlackAnimalFactory implements AnimalFactory {
  20. 20
  21. 21 function createCat(){
  22. 22 return new BlackCat();
  23. 23 }
  24. 24
  25. 25 function createDog(){
  26. 26 return new BlackDog();
  27. 27 }
  28. 28 }
  29. 29
  30. 30 class WhiteAnimalFactory implements AnimalFactory {
  31. 31
  32. 32 function createCat(){
  33. 33 return new WhiteCat();
  34. 34 }
  35. 35
  36. 36 function createDog(){
  37. 37 return new WhiteDog();
  38. 38 }
  39. 39 }
  40. 40
  41. 41 //抽象产品
  42. 42 interface Cat {
  43. 43 function Voice();
  44. 44 }
  45. 45
  46. 46 interface Dog {
  47. 47 function Voice();
  48. 48 }
  49. 49
  50. 50 //具体产品
  51. 51 class BlackCat implements Cat {
  52. 52
  53. 53 function Voice(){
  54. 54 echo '黑猫喵喵……';
  55. 55 }
  56. 56 }
  57. 57
  58. 58 class WhiteCat implements Cat {
  59. 59
  60. 60 function Voice(){
  61. 61 echo '白猫喵喵……';
  62. 62 }
  63. 63 }
  64. 64
  65. 65 class BlackDog implements Dog {
  66. 66
  67. 67 function Voice(){
  68. 68 echo '黑狗汪汪……';
  69. 69 }
  70. 70 }
  71. 71
  72. 72 class WhiteDog implements Dog {
  73. 73
  74. 74 function Voice(){
  75. 75 echo '白狗汪汪……';
  76. 76 }
  77. 77 }
  78. 78
  79. 79 //客户端
  80. 80 class Client {
  81. 81
  82. 82 public static function main() {
  83. 83 self::run(new BlackAnimalFactory());
  84. 84 self::run(new WhiteAnimalFactory());
  85. 85 }
  86. 86
  87. 87 public static function run(AnimalFactory $AnimalFactory){
  88. 88 $cat = $AnimalFactory->createCat();
  89. 89 $cat->Voice();
  90. 90
  91. 91 $dog = $AnimalFactory->createDog();
  92. 92 $dog->Voice();
  93. 93 }
  94. 94 }
  95. 95 Client::main();
  96. 96 ?>

发表评论

表情:
评论列表 (有 0 条评论,424人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式抽象工厂模式

    创造性设计模式 创造型模式主要是为了实例化类所用。进一步又分为类创建、对象创建模式。 类创建模式 类创建模式主要基于继承方式进行实例化 对象创建模式 对象

    相关 设计模式抽象工厂模式

    抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指

    相关 设计模式抽象工厂模式

    在工厂方法模式中,我们使用一个工厂创建一个产品,也就是说一个具体的工厂对应一个具体的产品。但是有时候我们需要一个工厂能够提供多个产品对象,而不是单一的对象,这个时候我们就需要使

    相关 设计模式-抽象工厂模式

    抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指