浅谈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中的SSL/TLS。

    作为一种面向网络的脚本语言,PHP在Web应用程序中发挥着重要的作用。特别是在涉及到用户隐私和安全性的场景中,SSL/TLS技术的支持成为了PHP开发者极为重要的一个方面。SSL(Secure Sockets Layer)和TLS(Transport…

    2023年5月28日
    03
  • PHP中如何使用第三方授权登录?

    在当今社交化的时代,用户不再满足于传统的注册登录方式,希望可以使用自己已经注册的社交账号直接登录。为了实现这个需求,很多网站都提供了第三方登录的接入。在PHP中,我们可以通过OAuth协议来实现第三方授权登…

    2023年5月17日
    03
  • PHP与BI工具的集成

    随着数据分析和商业智能(BI)的普及,越来越多的企业开始使用BI工具来帮助他们更好地理解和管理企业数据。PHP是一种广泛使用的Web开发语言,在企业中也非常常见。因此,将PHP和BI工具集成在一起可以带来许多好处。…

    2023年5月19日
    01
  • PHP中如何进行软件产品的版本控制?

    随着软件开发的不断发展,版本控制已经成为了一个必要的工具。通过版本控制,一个软件产品的所有版本都可以被记录、追踪和管理。在PHP开发中,版本控制也是不可或缺的一部分,特别是在团队开发中,更是必须要用到版…

    2023年5月17日
    01
  • PHP入门指南:PHP和Spark。

    PHP是一种非常流行的服务器端编程语言,因为它简单易学、开放源代码和跨平台。目前,很多大企业都采用PHP语言来构建应用程序,例如Facebook和WordPress等。Spark是一种快速且轻量级的开发框架,可用于构建Web应用程…

    2023年5月22日
    04
  • 如何使用PHP和JavaScript构建在线编辑器。

    随着网络技术的不断发展,越来越多的人开始使用在线编辑器编辑文本、代码等内容。如果您是一名开发人员,您可能会想要了解如何使用PHP和JavaScript构建您自己的在线编辑器。本文将介绍一些基本的步骤和技术,帮助您…

    2023年5月30日
    00
  • 我来教你php字符串连接函数。

    PHP中,可以使用 .= 运算符将字符串连接起来。要将两个字符串连接起来,可以使用以下代码:,,“php,$string1 = "Hello";,$string2 = "World!";,$string3 = $string1 . " " . $string2; // 现在 $string3 …

    2024年7月10日
    00
  • 关于php preg_replace_callback回调函数传参问题

    preg_replace_callback这个函数的作用是执行一个正则表达式搜索并且使用一个回调进行替换preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int &$count ]…

    2022年6月25日
    0129

联系我们

QQ:951076433

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