PHP设计模式之抽象工厂模式实例分析

这篇文章主要介绍了PHP设计模式之抽象工厂模式,结合实例形式分析了php抽象工厂模式的概念、原理、使用方法及相关操作注意事项,需要的朋友可以参考下。

本文实例讲述了PHP设计模式之抽象工厂模式,分享给大家供大家参考,具体如下:

前面的文章说了PHP下的简单工厂(静态工厂) 和工厂模式,现在说一下抽象工厂模式

工厂模式我们已经说过,增加一个产品很简单,增加对应的产品类和工厂类,不需要对原有代码进行改动,符合开闭原则

现在接着上篇文章,我们又有了新的需求,我们要求苹果味饮料和香蕉味饮料,有百事和可口可乐两个品牌,用工厂模式,就实现不了了,我只能增加单一的产品,但是增加品牌我实现不了,引申而出抽象工厂模式,代码如下:

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: tiansi
  5. * Date: 18/1/23
  6. * Time: 下午5:10
  7. */
  8. //工厂接口
  9. interface FruitFactory{
  10. //生产饮料方法
  11. function makeAppleFruit();
  12. function makeBananaFruit();
  13. }
  14. //饮料接口
  15. interface Fruit{
  16. function getFruitName();
  17. }
  18. class BaishiAppleFruit implements Fruit{
  19. function getFruitName()
  20. {
  21. echo '百事苹果味饮料';
  22. }
  23. }
  24. class BaishiBananaFruit implements Fruit{
  25. function getFruitName()
  26. {
  27. echo '百事香蕉味饮料';
  28. }
  29. }
  30. class ColeiAppleFruit implements Fruit{
  31. function getFruitName()
  32. {
  33. echo '可口可乐苹果味饮料';
  34. }
  35. }
  36. class ColeBananaFruit implements Fruit{
  37. function getFruitName()
  38. {
  39. echo '可口可乐香蕉味饮料';
  40. }
  41. }
  42. //百事饮料工厂
  43. class BaishiFruitFactory implements FruitFactory{
  44. function makeAppleFruit()
  45. {
  46. //生产百事苹果饮料
  47. return new BaishiAppleFruit();
  48. }
  49. function makeBananaFruit()
  50. {
  51. //生产百事香蕉饮料
  52. return new BaishiBananaFruit();
  53. }
  54. }
  55. //可口可乐饮料工厂
  56. class ColeFruitFactory implements FruitFactory{
  57. function makeAppleFruit()
  58. {
  59. //生产可口可乐苹果饮料
  60. return new ColeiAppleFruit();
  61. }
  62. function makeBananaFruit()
  63. {
  64. //生产可口可乐香蕉味饮料
  65. return new ColeBananaFruit();
  66. }
  67. }
  68. $baishi_factory = new BaishiFruitFactory();
  69. $baishi_factory->makeAppleFruit()->getFruitName();
  70. echo "<br/>";
  71. $baishi_factory->makeBananaFruit()->getFruitName();
  72. echo "<br/>";
  73. $cole_factory = new ColeFruitFactory();
  74. $cole_factory->makeAppleFruit()->getFruitName();
  75. echo "<br/>";
  76. $cole_factory->makeBananaFruit()->getFruitName();

运行结果:

百事苹果味饮料

百事香蕉味饮料

可口可乐苹果味饮料

可口可乐香蕉味饮料

现在我们可以看到 如果想要再增加一个品牌的话 只需要再写一个工厂类 并写上对应的产品类 就可以在不改动原有代码的前提下 成功增加品牌。

但是这会儿想要再增加一个单一产品,就很麻烦了,需要更改工厂类,这就是工厂和抽象工厂的区别。

工厂模式针对于单一产品,一个产品抽象类,每个工厂只能创建一个产品,支持扩展单个产品,不支持扩展产品族,针对一个产品等级结构。

抽象工厂针对于产品族,多个产品抽象类,每个工厂能创建多个产品,支持扩展产品族,不支持扩展单个产品,针对多个产品等级结构。