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)
上一篇 2022年7月25日 下午11:36
下一篇 2022年7月25日 下午11:36


相关推荐

  • 十九、原型模式—通过复制生产实例 #和设计模式一起旅行#[通俗易懂]

    拔一根猴毛,变出十万个孙悟空故事背景在java中,我们一般创建实例的时候可以使用了new 关键词指定类名来生成类的实例。例如:Preson p = new Person();或者Person p = Person.getInstance();但是是在实际开发过程中,有时候会有“不指定类名的前提下生成实例”的需求。这种情况下,就不能通过上面的这种方式生成实例!…

    2022年2月27日
    45
  • Java中常用的设计模式

    Java中常用的设计模式文章转载借鉴:http://blog.csdn.net/zhangerqing一、什么是设计模式设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块…

    2022年7月8日
    20
  • JAVA设计模式——适配器模式

    JAVA设计模式——适配器模式适配器模式是一种结构型设计模式。适配器模式的思想是:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。用电器来打个比喻:有一个电器的插头是三脚的,而现有的插座是两孔的,要使插头插上插座,我们需要一个插头转换器,这个转换器即是适配器。适配器模式涉及3个角色:源(Adaptee):需要被适配的对象或类型,相当于插头。适配器(Ad

    2022年7月25日
    11
  • 设计模式–策略模式(Strategy)

    设计模式–策略模式(Strategy)

    2021年7月30日
    68
  • Carson带你学设计模式:模板方法模式(Template Method)

    Carson带你学设计模式:模板方法模式(Template Method)手把手带你全面了解模板方法模式

    2026年3月19日
    2
  • 二十、设计模式总结—后会有期 #和设计模式一起旅行#

    告别 是为了下一次相遇,告别更是新的开始!设计模式整了两个月了,看了一些书籍和一些博客,整体是完成了,但是还有一些模式没有总结出来,不过剩下的模式暂时不准备在更新了,剩下的也相对来说不是那么的重要!在看设计模式的这段时间中,总是有一种感觉,看到其中的一个设计模式,有似曾相识的感觉,看完之后比较清晰了,也会想着在工作那些地方遇到了设计模式,还有就是自己在设计的时候也有一些意识,会考虑…

    2022年2月27日
    38

发表回复

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

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