浅谈PHP中的工厂方法模式

本篇文章带大家了解一下PHP设计模式中的工厂方法模式。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

浅谈PHP中的工厂方法模式

上回说到,简单工厂不属于GoF的二十三种设计模式,这回可就来真家伙了,大名顶顶的工厂方法模式前来报道!

GoF类图解释

工厂方法模式对比简单工厂来说,最核心的一点,其实就是将实现推迟到子类。怎么理解呢?我们可以将上回的简单工厂当做父类,然后有一堆子类去继承它。createProduct()这个方法在父类中也变成一个抽象方法。然后所有的子类去实现这个方法,不再需要用switch去判断,子类直接返回一个实例化的对象即可。

GoF定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化推迟到其子类。

GoF类图:

1.gif

  • 类图中的Product为产品
  • 类图中的Creator为创建者
  • 创建者父类有一个抽象的FactoryMethod()工厂方法
  • 所有创建者子类需要实现这个工厂方法,返回对应的具体产品
  • 创建者父类可以有一个AnOperation()操作方法,直接返回product,可以使用FactoryMethod()去返回,这样外部只需要统一调用AnOperation()

代码实现

首先是商品相关的接口和实现类,和简单工厂的类似:

// 商品接口
interface Product{
    function show() : void;
}

// 商品实现类A
class ConcreteProductA implements Product{
    public function show() : void{
        echo "I'm A.\\n";
    }
}

登录后复制

接下来是创建者的抽象和实现类:

// 创建者抽象类
abstract class Creator{

    // 抽象工厂方法
    abstract protected function FactoryMethod() : Product;

    // 操作方法
    public function AnOperation() : Product{
        return $this->FactoryMethod();
    }
}

// 创建者实现类A
class ConcreteCreatorA extends Creator{
    // 实现操作方法
    protected function FactoryMethod() : Product{
        return new ConcreteProductA();
    }
}

登录后复制

这里和简单工厂就有了本质的区别,我们去掉了恶心的switch,让每个具体的实现类来进行商品对象的创建。没错,单一和封闭,每个单独的创建者子类只在工厂方法中和一个商品有耦合,有没有其他商品和其他的工厂来跟客户合作过这个子类完全不知道。

同样还是拿手机来比喻:我是一个卖手机的批发商(客户Client,业务方),我需要一批手机(产品ProductA),于是我去让富X康(工厂Creator)来帮我生产。我跟富士康说明了需求,富士康说好的,让我的衡阳工厂(ConcreteCreatorA)来搞定,不需要总厂上,你这小单子,洒洒水啦。然后过了一阵我又需要另一种型号的手机(产品ProductB),富士康看了看后又让郑州富士康(ConcreteCreatorB)来帮我生产。反正不管怎么样,他们总是给了我对应的手机。而且郑州工厂并不知道衡阳工厂生产过什么或者有没有跟我合作过,这一切只有我和总工厂知道。

实例

场景:光说不练假把式,把上回的短信发送改造改造,我们依然还是使用上回的那几个短信发送商。毕竟大家已经很熟悉了嘛,不过以后要更换也说不定,商场如战场,大家还是利益为先。这样的话,我们通过工厂方法模式来进行解耦,就可以方便的添加修改短信提供商咯。

短信发送类图

2.gif

代码实现

<?php

interface Message {
    public function send(string $msg);
}

class AliYunMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return '阿里云短信(原阿里大鱼)发送成功!短信内容:' . $msg;
    }
}

class BaiduYunMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return '百度SMS短信发送成功!短信内容:' . $msg;
    }
}

class JiguangMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return '极光短信发送成功!短信内容:' . $msg;
    }
}


abstract class MessageFactory{
    abstract protected function factoryMethod();
    public function getMessage(){
        return $this->factoryMethod();
    }
}

class AliYunFactory extends MessageFactory{
    protected function factoryMethod(){
        return new AliYunMessage();
    }
}

class BaiduYunFactory extends MessageFactory{
    protected function factoryMethod(){
        return new BaiduYunMessage();
    }
}

class JiguangFactory extends MessageFactory{
    protected function factoryMethod(){
        return new JiguangMessage();
    }
}

// 当前业务需要使用百度云
$factory = new BaiduYunFactory();
$message = $factory->getMessage();
echo $message->send('您有新的短消息,请查收');

登录后复制

说明

  • 和类图完全一致,基本不需要什么说明了吧,注意工厂方法模式的特点,实现推迟到了子类!!
  • 业务调用的时候需要耦合一个Factory子类。确实是这样,如果你想一个统一的出口来调用,请在外面加一层简单工厂就好啦,这就当成一道思考题吧
  • 不拘泥于目前的形式,可以不用抽象类,直接用一个接口来定义工厂方法,摒弃掉getMessage()方法,外部直接调用公开的模板方法(factoryMethod)即可

关于浅谈PHP中的工厂方法模式的文章就分享到这,如果对你有帮助欢迎继续关注我们哦

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/244223.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
php学习php学习订阅用户
上一篇 2023年3月29日 23:09
下一篇 2023年3月29日 23:09

相关推荐

  • 我来教你php多虚拟主机配置的步骤是什么。

    在PHP开发中,多虚拟主机配置是一个常见的需求,通过配置多个虚拟主机,可以在同一台服务器上托管多个网站,每个网站都有自己的域名、目录和配置文件,下面将详细介绍PHP多虚拟主机配置的步骤。 1. 安装Apache和PHP…

    2024年7月12日
    00
  • PHP商城开发中的集成与部署

    随着电商行业的快速发展,越来越多的企业开始关注自身在电商领域的布局与发展。而作为电商网站的核心技术之一,PHP商城开发的集成与部署也逐渐成为了企业关注的焦点。本文将从技术层面讲述PHP商城开发中的集成与部…

    2023年5月19日
    01
  • 如何在PHP中进行增强学习和智能问答。

    随着人工智能技术的发展,智能问答和增强学习已经在各种领域得到了广泛应用,其中包括对话系统、自然语言处理、语音识别、图像识别等等。这些技术可以帮助我们更高效地处理大量数据,减少人工操作和人力成本。在PHP…

    2023年5月23日
    02
  • PHP字符串类型string

    js中,虽然有2种字符串表达形式,但也应该理解为是一种字符串: var  str1 = ‘单引号字符串’ var   str2 = “双引号字符串”; 但在php中,单引号和双引哈字符串,是有不同细节含义的字符串。   php中,有4种字符…

    2018年3月14日
    0383
  • PHP调用创蓝短信接口实现批量短信发送。

    随着移动互联网的发展,短信营销方式得到广泛应用,短信发送已经成为企业推广的一种重要方式。对于企业而言,短信营销成本低、效果好,是提高品牌知名度、促进销售的不错选择。 本文将介绍如何使用PHP调用创蓝短信…

    2023年5月30日
    02
  • BREAK和CONTINUE区别

    Break是直接结束当前循环,continue是跳过当次循环。 这两个用法都有一个设置数字的方式,默认为1;  如:break 数字;  continue 数字; 数字代表退出或者跳过几个循环。 如果循环不够会报致命错误。

    2018年3月22日
    0221
  • PHP8.0中的JVM序列化库

    随着PHP 8.0的发布,许多新功能得到了带来。其中之一是引入了JVM序列化库,这是一项旨在提高性能的功能。在这篇文章中,我们将详细探讨PHP8.0中的JVM序列化库。 JVM序列化是什么? 在开始之前,让我们先了解一下JVM…

    2023年5月19日
    01
  • PHP入门指南:数据库优化。

    随着互联网的快速发展,数据库成为了许多企业应用系统的核心组件之一。而PHP作为流行的Web编程语言,对数据库的操作也是尤为频繁。数据库优化是提高应用系统性能的重要手段之一,本文将从PHP应用的角度出发,为大家…

    2023年5月22日
    01

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息