一、什么是工厂方法模式

  作为一种创建型设计模式,工厂方法模式就是要创建“某种东西”。对于工厂方法,要创建的“东西”是一个产品,这个产品与创建它的类之间不存在绑定。实际上,为了保持这种松耦合,客户会通过一个工厂发出请求,再由工厂创建所请求的产品。利用工厂方法模式,请求者只发出请求,而不具体创建产品。

二、什么时候使用工厂方法模式

  如果实例化对象的子类可能改变,就要使用工厂方法模式。

三、一般工厂方法模式

  使用一般工厂方法模式时,客户只包含工厂的引用,一个工厂生产一种产品。增加一种产品的同时需要增加一个新工厂类和一个新产品类。

  1. <?php
  2. /**
  3. * 一般工厂方法设计模式
  4. **/
  5.  
  6. //工厂抽象类
  7. abstract class Factory
  8. {
  9. protected abstract function produce();
  10.  
  11. public function startFactory()
  12. {
  13. $pro = $this->produce();
  14. return $pro;
  15. }
  16. }
  17.  
  18. //文本工厂
  19. class TextFactory extends Factory
  20. {
  21. protected function produce()
  22. {
  23. $textProduct = new TextProduct();
  24. return $textProduct->getProperties();
  25. }
  26. }
  27.  
  28. //图像工厂
  29. class ImageFactory extends Factory
  30. {
  31. protected function produce()
  32. {
  33. $imageProduct = new ImageProduct();
  34. return $imageProduct->getProperties();
  35. }
  36. }
  37.  
  38. //产品类接口
  39. interface Product
  40. {
  41. public function getProperties();
  42. }
  43.  
  44. //文本产品
  45. class TextProduct implements Product
  46. {
  47. private $text;
  48.  
  49. function getProperties()
  50. {
  51. $this->text = "此处为文本";
  52. return $this->text;
  53. }
  54. }
  55.  
  56. //图像产品
  57. class ImageProduct implements Product
  58. {
  59. private $image;
  60.  
  61. function getProperties()
  62. {
  63. $this->image = "此处为图像";
  64. return $this->image;
  65. }
  66. }
  67.  
  68. //客户类
  69. class Client
  70. {
  71. private $textFactory;
  72. private $imageFactory;
  73.  
  74. public function __construct()
  75. {
  76. $this->textFactory = new TextFactory();
  77. echo $this->textFactory->startFactory() . '<br />';
  78.  
  79. $this->imageFactory = new ImageFactory();
  80. echo $this->imageFactory->startFactory() . '<br />';
  81. }
  82. }
  83.  
  84. $client = new Client();
  85. ?>

  

四、参数化工厂方法模式

  使用参数化工厂方法模式时,客户包含工厂和产品的引用,发出请求时需要指定产品的种类,一个工厂生产多种产品。增加一种产品时只需要增加一个新产品类即可。

  1. <?php
  2. /**
  3. * 参数化工厂方法设计模式
  4. **/
  5.  
  6. //工厂抽象类
  7. abstract class Factory
  8. {
  9. protected abstract function produce(Product $product);
  10.  
  11. public function startFactory(Product $product)
  12. {
  13. $pro = $this->produce($product);
  14. return $pro;
  15. }
  16. }
  17.  
  18. //工厂实现
  19. class ConcreteFactory extends Factory
  20. {
  21. protected function produce(Product $product)
  22. {
  23. return $product->getProperties();
  24. }
  25. }
  26.  
  27. //产品类接口
  28. interface Product
  29. {
  30. public function getProperties();
  31. }
  32.  
  33. //文本产品
  34. class TextProduct implements Product
  35. {
  36. private $text;
  37.  
  38. public function getProperties()
  39. {
  40. $this->text = "此处为文本";
  41. return $this->text;
  42. }
  43. }
  44.  
  45. //图像产品
  46. class ImageProduct implements Product
  47. {
  48. private $image;
  49.  
  50. public function getProperties()
  51. {
  52. $this->image = "此处为图像";
  53. return $this->image;
  54. }
  55. }
  56.  
  57. //客户类
  58. class Client
  59. {
  60. private $factory;
  61. private $textProduct;
  62. private $imageProduct;
  63.  
  64. public function __construct()
  65. {
  66. $factory = new ConcreteFactory();
  67. $textProduct = new TextProduct();
  68. $imageProduct = new ImageProduct();
  69.  
  70. echo $factory->startFactory($textProduct) . '<br />';
  71. echo $factory->startFactory($imageProduct) . '<br />';
  72. }
  73. }
  74.  
  75. $client = new Client();
  76. ?>

  

PHP设计模式一:工厂方法设计模式的更多相关文章

  1. C#设计模式(3)——工厂方法模式

    一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...

  2. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  3. C#设计模式(3)——工厂方法模式(转)

    C#设计模式(3)——工厂方法模式   一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...

  4. Java设计模式之工厂方法模式(转) 实现是抽象工厂?

    Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站   文本Tag: 设计模式 Java [IT168 技术文章]         ...

  5. php设计模式之工厂方法模式

    php设计模式之工厂方法模式 工厂方法模式 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Pol ...

  6. 23种设计模式之工厂方法(Factory Method Pattern)

    工厂方法 前面我们学习了简单工厂,发现一个问题就是简单工厂集合了矛盾,为了解决这个问题我们针对每一种产品提供一个工厂类.通过不同的工厂实例来创建不同的产品实例.在同一等级结构中,支持增加任意产品这种设 ...

  7. java设计模式之工厂方法探究

    简单工厂 + 工厂方法 + 抽象工厂       看了十几篇博客,每篇基本上都能有个自己的解释,我汇总这些内容,重新梳理整理了一番,以形成自己的理解.       简单工厂模式其实不算23种设计模式之 ...

  8. 浅谈C++设计模式之工厂方法(Factory Method)

    为什么要用设计模式?根本原因是为了代码复用,增加可维护性. 面向对象设计坚持的原则:开闭原则(Open Closed Principle,OCP).里氏代换原则(Liskov Substitution ...

  9. java 23 - 1 设计模式之工厂方法模式

    转载: JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

随机推荐

  1. 201521123015 《JAVA程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业:本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  2. MongDB开启权限认证

    在生产环境中MongoDB已经使用有一段时间了,但对于MongoDB的数据存储一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),最近在酷壳网看了一篇技术文章(https://cools ...

  3. python和C语言混编的几种方式

    Python这些年风头一直很盛,占据了很多领域的位置,Web.大数据.人工智能.运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚出来的时候,似乎就是为了描述它. Pytho ...

  4. CA认证和颁发吊销证书

    摘要:涉及到网络安全这一块,想必大家都听过CA吧.像百度.淘宝.京东等这些知名网站,每年都要花费一笔money来买CA证书.但其实简单的企业内的CA认证,我们自己就可以实现,今天小编我就讲解一下怎么在 ...

  5. U方法

    U方法用于完成对URL地址的组装,特点在于可以自动根据当前的URL模式和设置生成对应的URL地址,格式为:U('地址','参数','伪静态','是否跳转','显示域名');在模板中使用U方法而不是固定 ...

  6. 【模版】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模版题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 题目描述 给定n个模式串和1个文本串,求有多少个模式串在文本 ...

  7. linux上搭建ftp

    linux上搭建ftp 重要 解决如何搭建ftp         解决用户指定访问其根目录         解决访问ftp超时连接         解决ftp主动连接.被动连接的问题 1.安装ftp ...

  8. Jmeter脚本录制方法(一)——分别使用Badboy录制和Jmeter自带的代理服务器录制

    Jmeter录制方式分三种,分别是:使用Badboy录制.Jmeter自带的代理服务器录制和手工录制,今天先介绍前两种录制方法. Badboy录制 Badboy是用C++开发的动态应用测试工具, 其拥 ...

  9. vue脚手架使用swiper /引入js文件/引入css文件

    1.安装vue-cli 参考地址:https://github.com/vuejs/vue-cli 如果不使用严格语法需要在后三项打no:(加了挺头疼的,老是报错,但是对自己的代码规范性也是有很大的帮 ...

  10. jquery定时刷新数据

    $(function () { setInterval("startRequest()", 3000); }); function startRequest() { $(" ...