序言

每一种模式都有它的定义,它的使用场景。我们从实际当中进行学习并且在相应额场景可以运用。所谓的设计模式只是一种思想,并不存在是有固定的代码。学会了思想并且对应上使用的场景,慢慢而言在开发之中这也就慢慢成为你的一部分。

今天我们来讲的是工厂模式,工厂模式一共分3三种。简单工厂模式,工厂方法模式以及抽象工厂模式。

简单工厂模式

在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

用一种很通俗的话来说就是,当一位买家向玩具工厂订货,正好工厂有生产洋娃娃车间,布袋熊车间,汤姆猫车间等等。买家说我需要洋娃娃,而工厂的终端与买家达成协议,并下达命令通知对应的车间进行生产。

具体我们使用php来模拟简单工厂模式,它有那一些构造呢。

如:

Factory类:负责创建具体产品的实例

Product类:抽象产品类,定义产品子类的公共接口

ConcreteProduct 类:具体产品类,实现Product父类的接口功能,也可添加自定义的功能

Factory类,只负责下发对应命令并且拿到相对应的产品。

require_once 'dolly.php';

require_once 'tomcat.php';

require_once 'wombat.php';​

/** * Class factory */

class SimpleFactory{

/**

* 通知生产车间

* @param string $name 实际终端下的命令

* @return Dolly|Tomcat|Wombat

* @throws Exception

*/

public static function noticeWorkShop($name){

switch ($name) {

// 洋娃娃

case 'dolly':

return new Dolly();​

// 汤姆猫

case 'tom_cat':

return new Tomcat();​

// 布袋熊

case 'wombat':

return new Wombat();​

default:

throw new Exception('抱歉!我们工厂不生产该种类玩具。');

}

}

}

​try {

$product = SimpleFactory::noticeWorkShop('dolly');

echo $product->sound();

} catch (Exception $e) {

echo $e->getMessage();

}

复制代码

product接口类定义产品对应所拥有的行为

​​interface Product {

/**

* @return mixed

*/

public function sound();

}

复制代码

ConcreteProduct对应的产品行为

require_once 'product.php';

​class Dolly implements Product {

/** * Dolly constructor. */

public function __construct() {

}

/** * @return mixed */

public function sound() {

echo '我叫洋娃娃';

}

}

复制代码

总结简单工厂模式:

具体使用场景可以使用在

1. 不需要实例化过多的对象,尽可能保证代码的简单。

2. 不需要关注对象是如何生成的操作。

从简单的工厂模式来看,首先由于只有一个工厂类,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。

工厂方法

工厂方法模式是简单工厂的升级版,在原有的基础上对工厂进行一个抽象的升级,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说每个对象都有一个与之对应的工厂。

用一种很通俗的话来说就是,当一位买家向玩具工厂订货,原来在简单工厂里是使用的车间,后来进行了升级变成子工厂,由终端下发到对应的子厂商进行生产。

具体我们使用php来模拟简单工厂模式,它有那一些构造呢。在原有的基础上多了一个工厂的抽象类

如:

Factory类:负责创建具体产品的实例

Product类:抽象产品类,定义产品子类的公共接口

ConcreteProduct 类:具体产品类,实现Product父类的接口功能,也可添加自定义的功能

AbstractFactory类: 抽象工厂类,专门负责子厂商的生成

require_once 'dolly.php';

/** * Class AbstractFactory */

abstract class AbstractFactory {

/** * @return mixed */

abstract public static function create();

}

/** * Class DollyFactory */

class DollyFactory extends AbstractFactory {

/** * @return mixed */

public static function create() {

return new Dolly();

}

}

​$dolly = DollyFactory::create();

​$dolly->sound();

复制代码

总结工厂方法模式:

具体使用场景可以使用在

1. 通过子类来指定创建对应的对象。

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

抽象工厂方法

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。

通俗而言,工厂将生产电视和生产手机合并成一个工厂,而中间不同产品的类型成为1个工厂对应多个不同的产品。

/** * Interface MiPhone */

interface MiPhone {

/** * @return mixed */

public function display();

/** * @return mixed */

public function use();

}

/** * Class Mi */

class Mi implements MiPhone {

/** * @return mixed */

public function display() {

echo "显示屏幕内容";

}

/** * @return mixed */

public function use() {

echo "正常操作内容";

}

}

/** * Interface Tv */

interface Tv {

/** * @return mixed */

public function open();

/** * @return mixed */

public function use();

}

/** * Class MiTv */

class MiTv implements Tv {

/** * @return mixed */

public function open() {

echo "小米电视";

}

/** * @return mixed */

public function use() {

echo "切换不同的频道";

}

}

​abstract class Factory {

/** * @return mixed */

abstract public static function createPhone();

/** * @return mixed */

abstract public static function createTv();

}

/** * Class ProductFactory */

class ProductFactory extends Factory {

public static function createTV() {

return new MiTv();

}

​ public static function createPhone() {

return new Mi();

}

}

​$newTv = ProductFactory::createTV();

$newTv->open();

$newTv->use();

​$newPc = ProductFactory::createPhone();

$newPc->open();

$newPc->use();

复制代码

总结抽象工厂方法模式:

具体使用场景可以使用在

1. 不需要知道它所创建的对象的类

2. 需要一组对象共同完成某种功能时。并且可能存在多组对象完成不同功能的情况。

如果您对这些感兴趣,欢迎评论,收藏、转发给予支持!> 欢迎关注我的公众号:猿力说,每日分享学习之路的点点滴滴,以及程序人生.

php 工厂模式 使用场景,PHP设计模式之工厂模式相关推荐

  1. php 工厂模式封装数据库,PHP设计模式之工厂模式

    概念: 工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤. 很多高级模式都是依赖于工厂模式. 好处: PHP中能够创建基于变量内容的类的新实例,减少主代码流中的 ...

  2. 策略模式和工厂模式的区别_设计模式系列 — 策略模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(si ...

  3. android工厂模式源码,android 设计模式:工厂模式

    放在开头:了解一个设计模式,首先也是最重要的就是了解它的设计依据 工厂模式按抽象的角度,层次不同分为: 抽象工厂方法   抽象工厂 先声明一点:下面提到的抽象类包括   接口,抽象类 抽象工厂方法设计 ...

  4. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

  5. netflix 模式创新_创新设计模式:工厂模式

    netflix 模式创新 以前,我们对创建模式进行了介绍,并使用抽象工厂模式来创建对象族. 下一个模式是Factory模式 . 当涉及到Java时,工厂模式是最常用的模式之一. 那么工厂模式到底是什么 ...

  6. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  7. java 工厂模式详解_Java设计模式之工厂模式详解

    简单工厂其实并不是设计模式,只是一种编程习惯. 首先我们创建父类Cup,所有杯子类的父类.再创建它的子类BigCup和SmallCup类. public abstract class Cup { pu ...

  8. java责任链模式审批请假_Java设计模式-责任链模式

    Java设计模式-责任链模式 Java版本:jdk1.8 IDE:IDEA 一 前言 本文介绍责任链模式以及Java下的实现. 二 概念 1.什么是责任链模式 责任链模式(Chain of Respo ...

  9. java设计模式 建造模式_理解java设计模式之建造者模式

    理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...

最新文章

  1. SAP WM LT15不能取消二步法确认场景中只做过第一步确认的TO单
  2. 解决通过QQ客户端的空间邮箱等打开空间邮箱
  3. 什么是关键字驱动框架(自动化测试)
  4. 三个线程交替打印ABC(Condition实现精确通知)
  5. AI:2020年6月22日北京智源大会演讲分享之11:30-12:20Jorge教授《Zero-Order Optimization Methods with Applications to RL》
  6. apache加载php配置
  7. java删除文件夹的所有文件
  8. ZZULIOJ 1098: 复合函数求值(函数专题)
  9. 【STM32】HAL库 STM32CubeMX教程十四---SPI
  10. 无人驾驶的规划与控制(四)——反馈控制
  11. 一个好的公司网站应怎么样去推广
  12. Leetcode练习 快慢指针
  13. qq邮箱对方服务器退回,为什么我用QQ邮箱发邮件被退回来了?他说地 – 手机爱问...
  14. Office 2013-2021 C2R Install
  15. na5tr1 测距芯片调试小结
  16. 华为p50预计售价鸿蒙是什么,华为p50预计售价多少_华为p50价格预测
  17. 基于单片机的教室照明智能控制系统设计
  18. unicode计算机通用解码语言
  19. JS - 前端生成 UUID 四种方法
  20. 一个屌丝程序猿的人生(六十六)

热门文章

  1. java基础---集合collection的方法介绍
  2. leetcode 572. 另一个树的子树(Java版)
  3. Spring5参考指南: BeanWrapper和PropertyEditor
  4. unique函数_Office 365函数新世界:动态数组
  5. C++ map 使用详解(含C++20新特性)
  6. 3pc_three phase commit protocol协议理解
  7. poj 1144 割点和桥
  8. Web前端开发笔记——第二章 HTML语言 第五节 图像标签
  9. python数组展示_python如何显示数组
  10. 图片链接生成器软件_推荐10个小众但是黑科技十足的Windows软件