最近参加了几次面试,对于应用常见的几种设计模式问题,深有感触。为加强自身理解,同时也希望能给一些初级开发者一定的参考学习,决定开始就PHP常见的设计模式写下几篇博文,工作原因,会不定期更新,感谢您的耐心阅读!

今天这篇文章主要是描述一下PHP常见设计模式之工厂模式。工厂模式其实可以划分为:简单工厂模式、工厂方法模式、抽象工厂模式等。

1.简单工厂模式

简介:简单工厂模式又被称为静态工厂方法模式,属于设计模式中的类创建模式。官方解释为:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。一般用在具体产品很少扩展的情况下,不用经常修改,且不修改代码的话是不能实现扩展的。

优缺点:优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责;缺点在于工厂类不够灵活,增加新的产品时需要修改工厂类的代码,一旦产品较多时,工厂类将会变得异常复杂。

具体代码实例

<?phpclass A
{function __construct(){echo "我是A类";}
}class B
{function __construct(){echo "我是B类";}
}class Factory
{public static function create($name){if ($name == 'A') {return new A();} elseif ($name == 'B') {return new B();}}
}$a = Factory::create('A');
$b = Factory::create('B');

2.工厂方法模式

简介:工厂方法模式通过定义了一个抽象出来的核心工厂类,并同时定义创建产品对象的接口,而创建具体实例的工作延迟到工厂子类中去完成。这种设计方式好处是核心类只需要关注工厂类的接口定义,具体的实例交由具体的工厂子类去创建。当需要新增一个产品时,无需修改现有的代码,只需要添加一个新的产品类和对应的工厂子类即可,促使整体的扩展性更好。

优缺点:基于其简介我们可以了解到,工厂方法模式是在简单工厂模式的基础上进一步的抽象,保留了简单工厂模式的优点,且解决了它的缺点。在工厂方法模式中,核心类仅仅负责给出具体工厂必须实现的接口,而无需再负责具体的产品类实例化,使得系统可以在不修改整体代码的情况下方便的引进新的产品。

具体代码实例

<?phpinterface Basic
{public function actionOne();public function actionTwo();
}class A implements Basic
{public function actionOne(){echo "我是A类—方法1";}public function actionTwo(){echo "我是A类—方法2";}
}class B implements Basic
{public function actionOne(){echo "我是B类—方法1";}public function actionTwo(){echo "我是B类—方法2";}
}abstract class Factory
{abstract static function createBasic();
}class A_Factory extends Factory
{public static function createBasic(){return new A();}
}class B_Factory extends Factory
{public static function createBasic(){return new B();}
}$a = A_Factory::createBasic();
$a->actionOne();
$a->actionTwo();$b = B_Factory::createBasic();
$b->actionOne();
$b->actionTwo();

3.抽象工厂模式

简介:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。此模式是在工厂方法模式上的进一步扩展。在工厂方法模式中,一个具体工厂负责一类具体产品的处理(一对一关系),但当我们需要一个工厂负责生成多种类型产品时,就要抽象整个工厂类了。

举一个具体生活实例

  • 产品结构:假设一个抽象类是手机,其子类有小米手机、华为手机、荣耀手机,那么抽象的手机和具体品牌的手机之间则构成了一个产品结构,抽象手机是父类,具体品牌手机是其子类。
  • 产品组:产品组是指由同一工厂生产,位于不同产品结构中的一组产品。如华为厂家生产的华为手机、华为手环,华为手机属于手机产品结构中,华为手环则属于手环产品结构中中。

具体代码实例

<?phpinterface Phone
{public function open();public function operate();
}class HuaweiPhone implements Phone
{public function open(){echo "打开华为手机";}public function operate(){echo "操作华为手机";}
}interface Bracelet
{public function look();public function click();
}class XiaomiBracelet implements Bracelet
{public function look(){echo "查看小米手环";}public function click(){echo "点击小米手环";}
}abstract class Factory
{abstract public static function createPhone();abstract public static function createBracelet();
}class ProductFactory extends Factory{public static function createPhone(){return new HuaweiPhone();}public static function createBracelet(){return new XiaomiBracelet();}
}$newPhone = ProductFactory::createPhone();
$newPhone->open();
$newPhone->operate();$newBracelet = ProductFactory::createBracelet();
$newBracelet->look();
$newBracelet->click();

以上就是我对工厂模式的一些学习见解,希望对部分同行人在理解上有一定的帮助,感谢你们的关注!

PHP 常见设计模式——工厂模式相关推荐

  1. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  2. Java设计模式-工厂模式(2)工厂方法模式

    在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而"工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不 ...

  3. Java设计模式-工厂模式(1)简单工厂模式

    Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...

  4. 设计模式---工厂模式

    设计模式---工厂模式 工厂方法模式 概述:工厂方法模式中抽象工厂负责定义创建对象的接口,具体创建工作由继承抽象工厂的具体类实现. 优点:客户端不需要再负责对象的创建,从而明确了各个类的职责,如果有新 ...

  5. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  6. java设计模式工厂模式_Java中的复合设计模式

    java设计模式工厂模式 Composite pattern is one of the Structural design pattern. Composite design pattern is ...

  7. java设计模式工厂模式_Java中的桥梁设计模式

    java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...

  8. java设计模式工厂模式_Java中的外观设计模式

    java设计模式工厂模式 Facade Design Pattern is one of the Structural design patterns (such as Adapter pattern ...

  9. 设计模式-工厂模式(学习)

    设计模式-工厂模式(学习) 在程序的世界里,就像射雕英雄传一样,我们的技能就像是武功一样,我们只有不断去学习练习才能有机会像郭靖一样成为"天下第一". 我认为技能和武功是很类似的, ...

最新文章

  1. 下划线在 Python 中的特殊含义
  2. .Net开发笔记(十九) 创建一个可以可视化设计的对象
  3. 《转》浅谈CSRF攻击方式
  4. linux 挖矿效率_linux 服务器发现了挖矿病毒
  5. bearer token_四,接口认证方式:Bearer Token
  6. 字符串转码中文乱码问题的进一步理解 UTF-8 GBK转码
  7. 再也不怕重装eclipse! 让你的eclipse插件只下载一次
  8. 大学计算机基础操作题材料,《大学计算机基础》操作题
  9. (测试可用)针式打印机打印WEB页面字体不清晰,解决方法
  10. Python第一周学习总结
  11. 【原创】《华杉讲透《孙子兵法》》阅读有感(二)
  12. 一套优雅的开源后台管理系统:若依后台管理系统 3.3 发布,新增多项功能
  13. 记录一下Ubuntu下安装Docker遇到的坑
  14. Web3 网络效应:五种心智模型
  15. 计算机鼠标不动了,计算机鼠标不动了怎么解决?
  16. java-网页404(个例)
  17. itunes cannot read the contents of the iphone
  18. XML Publisher 模板开发小技巧
  19. 200亿元输血求生,中芯国际希望几何?
  20. html新开浏览器窗口,如何在当前浏览器窗口(html)中显示新窗口?

热门文章

  1. Win7 连接局域网共享之后 提示错误代码:0x800704b3
  2. 杭四中2021高考成绩如何查询,杭四中一本率
  3. javaweb摄影网
  4. L2 元年,Arbitrum Nitro 升级带来更兼容高效的开发体验
  5. 程序员的成长阶梯和级别[转]
  6. webpack (五) -打包-清理dist-使用英文版clean-webpack-plugin插件
  7. Server2003 开机显示引导或系统启动驱动程序无法加载
  8. Buuctf解题思路
  9. win10系统任务栏设置不展开只显示缩略图合并任务栏始终合并按钮的方法
  10. SQL中的where的用法