PHP设计模式-工厂模式[通俗易懂]

PHP设计模式-工厂模式[通俗易懂]PHP设计模式-工厂模式一、工厂模式概念工厂模式,顾名思义,像工厂的流水线,固定的规格,固定的材料,做固定的事情。工厂模式分为三种:简单工厂、工厂方法、抽象工厂,三种工厂的区别是,抽象工厂由多条产品线,而工厂方法只有一条产品线,是抽象工厂的简化。而工厂方法和简单工厂相对,大家初看起来好像工厂方法增加了许多代码但是实现的功能和简单工厂一样。但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。但是工厂方法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

PHP设计模式-工厂模式

一、工厂模式概念

工厂模式,顾名思义,像工厂的流水线,固定的规格,固定的材料,做固定的事情。

工厂模式分为三种:简单工厂、工厂方法、抽象工厂 ,三种工厂的区别是,抽象工厂由多条产品线,而工厂方法只有一条产品线,是抽象工厂的简化。而工厂方法和简单工厂相对,大家初看起来好像工厂方法增加了许多代码但是实现的功能和简单工厂一样。但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。但是工厂方法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客户去扩展。在分工时,核心工程师负责抽象工厂和抽象产品的定义,业务工程师负责具体工厂和具体产品的实现。只要抽象层设计的好,框架就是非常稳定的。

二、示例:

我这里用了一个上报埋点数据的类简单做个例子

1、工厂的标准

//神测上报的标准,在抽象类中定义
abstract class BaseBuriedPoint {
    /**
     * 埋点事件名
     */
    abstract protected function getEvent(): EventEnum;
    /**
     * 事件相关用户id
     */
    abstract protected function getDistinctId(): string;
    public function report(): void {
       //上报
    }
}

2、继承或实现抽象类 按照标准实现功能

/**
 * 首页埋点
 */
class IndexView extends BaseBuriedPoint{
    /**
     * @var string
     */
    protected $distinctId;
    /**
     * @var IndexPageEnum
     */
    protected $pageEnum;
    public function __construct(string $distinctId,IndexPageEnum $pageEnum) {
        $this->distinctId = $distinctId;
        $this->pageEnum = $pageEnum;
    }
    protected function getEvent(): EventEnum {
        return EventEnum::INDEX_PAGE();
    }
    protected function getDistinctId(): string {
        return $this->distinctId;
    }
    protected function getProperties(): array {
        return [
            'page_id' => $this->pageEnum->getValue(),
            'page_name' => $this->pageEnum->name,
        ];
    }
}
/**
 * 登陆埋点
 */
class Login extends BaseBuriedPoint{
    //
}

3、简单工厂

class ShenCe { //对比抽象工厂:抽象工厂模式可以生产不同的产品线 。把类抽象化interface 由不同的子类实现不同的产品线 
    // 简单工厂里的静态方法
    static function Index() { //对比工厂模式:方法接口化interface
        return new IndexView();
    }
    static function Login() {
        return new Login();
    } 
    //... 
} 

三、概念理解:

简单工厂调用 不需要管功能是那个类实现的 直接调用工厂里的方法,或者以传参形式调用

工厂方法比较简单工厂就是把简单工厂里的方法接口化

抽象工厂可以生产不同的产品线

工厂模式使用interface或者abstract都可以实现

四、扩展知识点:抽象类和接口的异同

1. 相同点:

(1)两者都是抽象类,都不能实例化。

(2) interface 实现类及 abstract class 的子类都必须要实现已经声明的抽象方法。

2.不同点:

(1)interface 需要实现,要用 implements ,而 abstract class 需要继承,要用 extends 。

(2)一个类可以实现多个 interface ,但一个类只能继承一个 abstract class 。

(3)interface 强调特定功能的实现,而 abstract class 强调所属关系。

(4)interface 中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体 ) ,实现类必须要实现。而 abstract class 中并非所有的方法都是抽象的,只有那些冠有 abstract 的方法才是抽象的,子类必须实现。

(5) abstract class 是 interface 与 class 的中介。 abstract class 在 interface 及 class 中起到了承上启下的作用。一方面, abstract class 是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。

(6)接口中的抽象方法前不用也不能加 abstract 关键字,默认隐式就是抽象方法,也不能加 final 关键字来防止抽象方法的继承。而抽象类中抽象方法前则必须加上 abstract 表示显示声明为抽象方法。

(7)接口中的抽象方法只能是 public 的,不能用 private , protected 修饰符修饰。而抽象类中的抽象方法则可以用 public , protected 来修饰,但不能用 private 。

五、总结:

工厂模式体现了PHP的三大特性 封装,继承,多态。通过工厂模式的开发,能够较大程度的降低代码间的耦合度,提高代码的可扩展性。但是也会存在相应的缺点,比如在需要在工厂抽象层基类中增加需要实现的抽象方法,就需要修改实现功能的所有的子类。所以设计抽象层非常重要。是否使用工厂模式或者抽象类需要结合实际情况灵活使用

版权声明:不支持转载

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164359.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C++ 23种设计模式(6)-适配器模式

    C++ 23种设计模式(6)-适配器模式适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。它包括类适配器和对象适配器,本文针对的是对象适配器。举个例子,在STL中就用到了适配器模式。STL实现了一种数据结构,称为双端队列(deque),支持前后两段的插入与删除。STL实现栈和队列时,没有从头开始定义它们,而是直接使用双端队列实现的。这里双端队列就扮演了适配器的角色。队列用到了它的后端插入,前端删除。而栈用到了它的后端插入,后端删除。假设栈和队列都是一种顺序容器,有两种操作:压入和弹出。

    2022年7月25日
    8
  • Java设计模式之行为型:策略模式

    Java设计模式之行为型:策略模式

    2021年10月4日
    43
  • 极速理解设计模式系列:14.轻量级模式(Flyweight Pattern)「建议收藏」

    极速理解设计模式系列:14.轻量级模式(Flyweight Pattern)

    2022年3月8日
    39
  • 设计模式之桥接(bridge)模式

    在现实生活中,我们常常会用到两种或多种类型的笔,比如毛笔和蜡笔。假设我们需要大、中、小三种类型的画笔来绘制12中不同的颜色,如果我们使用蜡笔,需要准备3*12=36支。但如果使用毛笔的话,只需要提供3

    2021年12月19日
    50
  • 设计模式——门面模式「建议收藏」

    设计模式——门面模式「建议收藏」今天我们继续来学习前面没有学完的结构型设计模式中的一种:门面模式。门面模式也是一种不太常用的设计模式。所以,我们今天依旧是了解为主,暂时不去深入的学习。概述门面模式:(FacadeDesignPattern)门面模式也叫外观模式,门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。门面模式原理和实现也比较简单,应用场景也比较明确,主要在接口设计方面使用。何时使用:解决易用性问题。解决性能问题。解决分布式事务问题。UML类图:角色组成:门面角色:客户端调用这个

    2025年6月6日
    1
  • 三、设计模式介绍—她是谁,我们要去哪里? #和设计模式一起旅行#

    模式模式(Pattern),指事物的标准样式,百度百科上面说的,其实说白了模式就是我们现在说的套路!模式 == 套路模式是一种思想,说大了特别的复杂和深奥,不管怎么样模式的使用可以解决特定场景下特定的问题!准确表达:模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。软件模式那么在软件中使用模式,就是软件模式(Software Pattern),用…

    2022年2月27日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号