当我要实例化类的时候,不直接new这个类,而是通过调用另一个类的方法来实例化,这就是工厂模式的核心,
就是用很多类,都是一种类型的,然后将这些类汇总在一个新的工厂类里边,工厂方法替你实例化,你想用哪个类,调用工厂类的方法,传入参数,就会返回你需要实例化的类,多了一个封装,类似switch干的活,
修改,增加改动比较少,统一控制,简化逻辑跟代码
工厂分为:简单工厂(静态工厂)、工厂方法模式,抽象工厂模式

简单工厂

其实简单工厂不属于23种设计模式,比较好理解,就是封装汇总

  1. /**
  2. * 定义一个接口,规定方法
  3. */
  4. interface Message
  5. {
  6. public function send($msg);
  7. }
  8. //不同的类实现接口
  9. class Ali implements Message
  10. {
  11. public function send($msg)
  12. {
  13. return '阿里短信->短信内容是:' . $msg;
  14. }
  15. }
  16. class Txun implements Message
  17. {
  18. public function send($msg)
  19. {
  20. return '腾讯短信->短信内容是:' . $msg;
  21. }
  22. }
  23. class Bdu implements Message
  24. {
  25. public function send($msg)
  26. {
  27. return '百度短信->短信内容是:' . $msg;
  28. }
  29. }
  30. /**
  31. * 工厂类
  32. */
  33. class MessageFactory
  34. {
  35. public static function CreateFactory($type)
  36. {
  37. switch ($type) {
  38. case 'ali':
  39. return new Ali();
  40. break;
  41. case 'tengxun':
  42. return new Txun();
  43. break;
  44. case 'baidu':
  45. return new Bdu();
  46. break;
  47. default:
  48. return null;
  49. break;
  50. }
  51. }
  52. }
  53. //使用简单工厂
  54. $messages = MessageFactory::CreateFactory('tengxun');
  55. echo $messages->send('你好,我叫大白');
  56. //输出 腾讯短信->短信内容是:你好,我叫大白
  1. 不用一定要使用static静态方法,根据需要来,可以new 然后调用<br />可以不用接口定义,只是为了规范一下,可以各个独立的类,方法一样就行<br />增加类,只需要增加对应的类文件 ,增加工厂类 switch type 就行,

工厂方法模式

工厂方法模式对比简单工厂,最核心的一点就是,将实现推迟到了子类中,将简单工厂当作父类,然后子类继承,实现功能,原本的父类的静态方法,变为抽象方法,子类实现这个方法,去掉的switch判断,子类直接返回实例化对象

  1. /**
  2. * 定义一个接口,规定方法
  3. */
  4. interface Message
  5. {
  6. public function send($msg);
  7. }
  8. //不同的类实现接口
  9. class Ali implements Message
  10. {
  11. public function send($msg)
  12. {
  13. return '阿里短信->短信内容是:' . $msg;
  14. }
  15. }
  16. class Txun implements Message
  17. {
  18. public function send($msg)
  19. {
  20. return '腾讯短信->短信内容是:' . $msg;
  21. }
  22. }
  23. class Bdu implements Message
  24. {
  25. public function send($msg)
  26. {
  27. return '百度短信->短信内容是:' . $msg;
  28. }
  29. }
  30. /**
  31. * 工厂类
  32. */
  33. abstract class MessageFactory
  34. {
  35. //抽象工厂方法
  36. abstract protected function CreateFactory();
  37. //返回实例化后的类
  38. public function Operation()
  39. {
  40. return $this->CreateFactory();
  41. }
  42. }
  43. //抽象实现子类
  44. class MessageAli extends MessageFactory
  45. {
  46. public function CreateFactory()
  47. {
  48. return new Ali();
  49. }
  50. }
  51. class MessageTxun extends MessageFactory
  52. {
  53. public function CreateFactory()
  54. {
  55. return new Txun();
  56. }
  57. }
  58. class MessageBdu extends MessageFactory
  59. {
  60. public function CreateFactory()
  61. {
  62. return new Bdu();
  63. }
  64. }
  65. //使用抽象方法工厂
  66. $Factory = new MessageAli();
  67. $messages = $Factory->Operation();
  68. echo $messages->send('你好,我叫大白');

抽象工厂模式

抽象工厂模式跟工厂方法模式相比,一样都是延迟到子类执行,一样返回指定对象,只是抽象工厂里面返回的不只是一个对象,而是多个

  1. <?php
  2. /**
  3. * 定义一个接口,规定方法
  4. */
  5. interface Message
  6. {
  7. public function send($msg);
  8. }
  9. //不同的类实现接口
  10. class Ali implements Message
  11. {
  12. public function send($msg)
  13. {
  14. return '阿里短信->短信内容是:'.$msg;
  15. }
  16. }
  17. class Txun implements Message
  18. {
  19. public function send($msg)
  20. {
  21. return '腾讯短信->短信内容是:'.$msg;
  22. }
  23. }
  24. class Bdu implements Message
  25. {
  26. public function send($msg)
  27. {
  28. return '百度短信->短信内容是:'.$msg;
  29. }
  30. }
  31. /**
  32. * 定义另外一个接口,规定方法
  33. */
  34. interface Message2
  35. {
  36. public function send($msg);
  37. }
  38. //不同的类实现接口
  39. class Ali2 implements Message2
  40. {
  41. public function send($msg)
  42. {
  43. return '阿里短信本分->短信内容是:'.$msg;
  44. }
  45. }
  46. class Txun2 implements Message2
  47. {
  48. public function send($msg)
  49. {
  50. return '腾讯短信本分->短信内容是:'.$msg;
  51. }
  52. }
  53. class Bdu2 implements Message2
  54. {
  55. public function send($msg)
  56. {
  57. return '百度短信本分->短信内容是:'.$msg;
  58. }
  59. }
  60. /**
  61. * 工厂类接口
  62. */
  63. interface MessageFactory
  64. {
  65. //抽象工厂方法
  66. public function CreateFactory();
  67. //抽象工厂方法
  68. public function CreateFactory2();
  69. }
  70. //抽象实现子类
  71. class MessageAli implements MessageFactory
  72. {
  73. public function CreateFactory()
  74. {
  75. return new Ali();
  76. }
  77. public function CreateFactory2()
  78. {
  79. return new Ali2();
  80. }
  81. }
  82. class MessageTxun implements MessageFactory
  83. {
  84. public function CreateFactory()
  85. {
  86. return new Txun();
  87. }
  88. public function CreateFactory2()
  89. {
  90. return new Txun2();
  91. }
  92. }
  93. class MessageBdu implements MessageFactory
  94. {
  95. public function CreateFactory()
  96. {
  97. return new Bdu();
  98. }
  99. public function CreateFactory2()
  100. {
  101. return new Bdu2();
  102. }
  103. }
  104. //使用抽象方法工厂
  105. $Factory= new MessageAli();
  106. $messages=$Factory->CreateFactory();
  107. $messages2=$Factory->CreateFactory2();
  108. echo $messages->send('你好,我叫大白');
  109. echo $messages2->send('你好,我叫大白');
  1. 就是子类里面实例化的对象,变为了多个,