PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。
根据抽象程度不同,PHP工厂模式分为:简单工厂模式、工厂方法模式和抽象工厂模式

简单工厂模式:

  1. /**
  2. *简单工厂模式与工厂方法模式比较。
  3. *简单工厂又叫静态工厂方法模式,这样理解可以确定,简单工厂模式是通过一个静态方法创建对象的。
  4. */
  5. interface people {
  6. function jiehun();
  7. }
  8. class man implements people{
  9. function jiehun() {
  10. echo '送玫瑰,送戒指!<br>';
  11. }
  12. }
  13. class women implements people {
  14. function jiehun() {
  15. echo '穿婚纱!<br>';
  16. }
  17. }
  18. class SimpleFactoty {
  19. // 简单工厂里的静态方法
  20. static function createMan() {
  21. return new man;
  22. }
  23. static function createWomen() {
  24. return new women;
  25. }
  26. }
  27. $man = SimpleFactoty::createMan();
  28. $man->jiehun();
  29. $man = SimpleFactoty::createWomen();
  30. $man->jiehun();

工厂方法模式:

  1. <?php
  2. /*
  3. *工厂方法模式:
  4. *定义一个创建对象的接口,让子类决定哪个类实例化。 他可以解决简单工厂模式中的封闭开放原则问题。<www.phpddt.com整理>
  5. */
  6. interface people {
  7. function jiehun();
  8. }
  9. class man implements people{
  10. function jiehun() {
  11. echo '送玫瑰,送戒指!<br>';
  12. }
  13. }
  14. class women implements people {
  15. function jiehun() {
  16. echo '穿婚纱!<br>';
  17. }
  18. }
  19. interface createMan { // 注意了,这里是简单工厂本质区别所在,将对象的创建抽象成一个接口。
  20. function create();
  21. }
  22. class FactoryMan implements createMan{
  23. function create() {
  24. return new man;
  25. }
  26. }
  27. class FactoryWomen implements createMan {
  28. function create() {
  29. return new women;
  30. }
  31. }
  32. class Client {
  33. // 简单工厂里的静态方法
  34. function test() {
  35. $Factory = new FactoryMan;
  36. $man = $Factory->create();
  37. $man->jiehun();
  38. $Factory = new FactoryWomen;
  39. $man = $Factory->create();
  40. $man->jiehun();
  41. }
  42. }
  43. $f = new Client;
  44. $f->test();

抽象工厂模式: 

  1. <?php
  2. /*
  3. 抽象工厂:提供一个创建一系列相关或相互依赖对象的接口。
  4. 注意:这里和工厂方法的区别是:一系列,而工厂方法则是一个。
  5. 那么,我们是否就可以想到在接口create里再增加创建“一系列”对象的方法呢?
  6. */
  7. interface people {
  8. function jiehun();
  9. }
  10. class Oman implements people{
  11. function jiehun() {
  12. echo '美女,我送你玫瑰和戒指!<br>';
  13. }
  14. }
  15. class Iman implements people{
  16. function jiehun() {
  17. echo '我偷偷喜欢你<br>';
  18. }
  19. }
  20. class Owomen implements people {
  21. function jiehun() {
  22. echo '我要穿婚纱!<br>';
  23. }
  24. }
  25. class Iwomen implements people {
  26. function jiehun() {
  27. echo '我好害羞哦!!<br>';
  28. }
  29. }
  30. interface createMan { // 注意了,这里是本质区别所在,将对象的创建抽象成一个接口。
  31. function createOpen(); //分为 内敛的和外向的
  32. function createIntro(); //内向
  33. }
  34. class FactoryMan implements createMan{
  35. function createOpen() {
  36. return new Oman;
  37. }
  38. function createIntro() {
  39. return new Iman;
  40. }
  41. }
  42. class FactoryWomen implements createMan {
  43. function createOpen() {
  44. return new Owomen;
  45. }
  46. function createIntro() {
  47. return new Iwomen;
  48. }
  49. }
  50. class Client {
  51. // 简单工厂里的静态方法
  52. function test() {
  53. $Factory = new FactoryMan;
  54. $man = $Factory->createOpen();
  55. $man->jiehun();
  56. $man = $Factory->createIntro();
  57. $man->jiehun();
  58. $Factory = new FactoryWomen;
  59. $man = $Factory->createOpen();
  60. $man->jiehun();
  61. $man = $Factory->createIntro();
  62. $man->jiehun();
  63. }
  64. }
  65. $f = new Client;
  66. $f->test();

区别:

简单工厂模式:用来生产同一等级结构中的任意产品。对与增加新的产品,无能为力

工厂模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品)   
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

以上三种工厂 方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法

适用范围:

简单工厂模式:

工厂类负责创建的对象较少,客户只知道传入工厂类的参数,对于如何创建对象不关心。

工厂方法模式:

当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,当类将创建对象的职责委托给多个帮助子类中得某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候,可以使用工厂方法模式。

抽象工厂模式:

一个系统不应当依赖于产品类实例何如被创建,组合和表达的细节,这对于所有形态的工厂模式都是重要的。这个系统有多于一个的产品族,而系统只消费其

中某一产品族。同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。系统提供一个产品类的库,所有的产品以同样的接口出现,从
而使客户端不依赖于实现。

无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。究竟用哪种设计模式更适合,这要根据具体的业务需求来决定。

PHP简单工厂模式、工厂方法模式和抽象工厂模式比较的更多相关文章

  1. 创建类模式(二):抽象工厂(Abstract Factory)

    定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式. ...

  2. Windows开启关闭测试模式的方法(含开启测试模式失败的解决办法)

    前言:           内含:Windows开启关闭测试模式的方法.开启测试模式失败的解决办法.win10进入bios的方式.BitLocker恢复方式.           对于互联网从业者来说 ...

  3. 简单工厂,Factory Method(工厂方法)和Abstract Factory(抽象工厂)模式

    对于简单工厂来说,它的工厂只能是这个样子的 public class SimplyFactory {  /** * 静态工厂方法 */ public static Prouct factory(Str ...

  4. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  5. 【JS设计模式】温习简单工厂模式、工厂方法模式、抽象工厂模式概念

    注:空心箭头表示的是种继承关系,工厂类和产品类之间是一种依赖关系.是用箭头加虚线表示的,以下的模型图是用的实线是不正确(时间不够用,在这里我偷懒了.这个习惯不好,呵呵) 简单工厂模式(Simple F ...

  6. iOS常用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

    1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂方法包含:父类拥有共同基础接口,具体子类实现子类特殊功能,工厂类根据参数区分创建不同子类实例.该场景对应的UML图如下 ...

  7. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

  8. Java设计模式之-----工厂模式(简单工厂,抽象工厂)

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  9. 设计模式的征途—3.工厂方法(Factory Method)模式

    上一篇的简单工厂模式虽然简单,但是存在一个很严重的问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则.如何实现新增新产品而 ...

  10. Java 工厂模式(一)— 工厂方法(Factory Method)模式

    一.工厂方法(Factory Method)模式: 1.什么是工厂方法模式? 工厂方法模式是类的创建型模式,又叫做虚拟构造子模式或者多态工厂模式.它的意义是创建产品对象的工厂接口,将实际创建工作推迟到 ...

随机推荐

  1. 深度学习原理与框架-RNN网络框架-LSTM框架 1.控制门单元 2.遗忘门单元 3.记忆门单元 4.控制门单元更新 5.输出门单元 6.LSTM网络结构

    LSTM网络是有LSTM每个单元所串接而成的, 从下面可以看出RNN与LSTM网络的差异, LSTM主要有控制门单元和输出门单元组成 控制门单元又是由遗忘门单元和记忆门单元的加和组成. 1.控制门单元 ...

  2. day04-运算符

    Python语言支持以下类型的运算符: 算术运算符比较运算符赋值运算符逻辑运算符位运算符成员运算符身份运算符 算术运算符 运算符 描述 实例 + 加 - 两个对象相加 10+20输出结果 30 - 减 ...

  3. FB4.6项目迁移到4.7时 embed报错问题

    问题: 从FB4.6或更早版本移植到4.7的项目Embed标签,比如 [Embed(source="assets/BtnPlay.png")]   ,会报错 解决 方案: 4.7E ...

  4. C++复习:C++的类型转换

    C++的类型转换 1 类型转换名称和语法 C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来 ...

  5. Linux下使用命令行配置IPMI

    ipmitool是什么: 百度百科给的解释已经够用了,简单说就是“IPMI(Intelligent Platform Management Interface)即智能平台管理接口是使硬件管理具备“智能 ...

  6. 计算机网络协议包头赏析-TCP

    仍然先把TCP报文段的格式放在这里,然后我们看图说话: TCP报文段也分为首部和数据两部分,首部默认情况下一般是20字节长度,但在一些需求情况下,会使用“可选字段”,这时,首部长度会有所增加. 下面, ...

  7. openwrt中防暴力破解shell的脚本

    原文:http://www.right.com.cn/forum/thread-124429-1-1.html 原理:1. snort做入侵检测是很好,但是太大太复杂,我们需要轻量化的操作.当对方进行 ...

  8. Android对接WebService -- The given SOAPAction http://webservice.ams.cnpc.com/getServerTime does not match an operation.

    问题描述:Chrome Restlet下模拟请求出现如下问题 The given SOAPAction http://webservice.ams.cnpc.com/getServerTime doe ...

  9. Java解决输出数组问题

    package test; public class doubleshuzu { public static void main(String[] args) { double a[][]; Stri ...

  10. 2019.2.4 nfs原理和安装实验

    NFS 访问一个本地文件还是NFS共享文件对于客户端而言都是透明的,当文件打开的瞬间,内核会作出一个决定,如果是本地文件内核会将本地NFS共享文件内核会将NFS共享文件的所有引用传递给——>NF ...