聊聊PHP中的抽象工厂模式

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

聊聊PHP中的抽象工厂模式

工厂模式系列中的重头戏来了,没错,那正是传闻中的抽象工厂模式。初次听到这个名字的时候你有什么感觉?反正我是感觉这货应该是非常高大上的,毕竟包含着“抽象”两个字。话说这两个字在开发中真的是有点高大上的感觉,一带上抽象两字就好像哪哪都很厉害了呢。不过,抽象工厂也确实可以说是工厂模式的大哥大。

Gof类图及解释

其实只要理解了工厂方法模式,就很容易明白抽象工厂模式。怎么说呢?还是一样的延迟到子类,还是一样的返回指定的对象。只是抽象工厂里面不仅仅只返回一个对象,而是返回一堆。

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

GoF类图:

1.gif

  • 左边是两个工厂1和2,都继承一个抽象工厂,都实现了CreateProductA和CreateProductB方法
  • 工厂1生产的是ProductA1和ProductB1
  • 同样的,工厂2生产的是ProductA2和ProductB2

代码实现

// 商品A抽象接口
interface AbstractProductA
{
    public function show(): void;
}

// 商品A1实现
class ProductA1 implements AbstractProductA
{
    public function show(): void
    {
        echo 'ProductA1 is Show!' . PHP_EOL;
    }
}
// 商品A2实现
class ProductA2 implements AbstractProductA
{
    public function show(): void
    {
        echo 'ProductA2 is Show!' . PHP_EOL;
    }
}

// 商品B抽象接口
interface AbstractProductB
{
    public function show(): void;
}
// 商品B1实现
class ProductB1 implements AbstractProductB
{
    public function show(): void
    {
        echo 'ProductB1 is Show!' . PHP_EOL;
    }
}
// 商品B2实现
class ProductB2 implements AbstractProductB
{
    public function show(): void
    {
        echo 'ProductB2 is Show!' . PHP_EOL;
    }
}

登录后复制

商品的实现,东西很多吧,这回其实是有四件商品了分别是A1、A2、B1和B2,他们之间假设有这样的关系,A1和B1是同类相关的商品,B1和B2是同类相关的商品

// 抽象工厂接口
interface AbstractFactory
{
    // 创建商品A
    public function CreateProductA(): AbstractProductA;
    // 创建商品B
    public function CreateProductB(): AbstractProductB;
}

// 工厂1,实现商品A1和商品B1
class ConcreteFactory1 implements AbstractFactory
{
    public function CreateProductA(): AbstractProductA
    {
        return new ProductA1();
    }
    public function CreateProductB(): AbstractProductB
    {
        return new ProductB1();
    }
}

// 工厂2,实现商品A2和商品B2
class ConcreteFactory2 implements AbstractFactory
{
    public function CreateProductA(): AbstractProductA
    {
        return new ProductA2();
    }
    public function CreateProductB(): AbstractProductB
    {
        return new ProductB2();
    }
}

登录后复制

而我们的工厂也是工厂1和工厂2,工厂1生产的是A1和B1这两种相关联的产品,工厂2生产的是A2和B2这两种商品。好吧,我知道这里还是有点抽象,可能还是搞不懂为什么要这样,我们继续以手机生产来举例。

我们的手机品牌起来了,所以周边如手机膜、手机壳也交给了富X康(AbstractFactory)来帮我搞定。上回说到,我已经有几款不同类型的手机了,于是还是按原来那样,衡阳工厂(Factory1)生产型号1001的手机(ProductA1),同时型号1001手机的手机膜(ProductB1)和手机壳(ProductC1)也是衡阳工厂生产出来。而型号1002的手机(ProductA2)还是在郑州工厂(Factory2),这个型号的手机膜(ProductB2)和手机膜(ProductC2)也就交给他们来搞定吧。于是,我还是只去跟总厂下单,他们让不同的工厂给我生产了一整套的手机产品,可以直接卖套装咯!!

实例

是不是看得还是有点晕。其实说简单点,真的就是在一个工厂类中通过不同的方法返回不同的对象而已。让我们再次用发短信的实例来讲解吧!

场景:这次我们有个业务需求是,不仅要发短信,还要同时发一条推送。短信的目的是通知用户有新的活动参加,而推送不仅通知有新的活动,直接点击就可以进去领红包了,是不是很兴奋。还好之前我们的选择的云服务供应商都是即有短信也有推送接口的,所以我们就直接用抽象工厂来实现吧!

短信发送类图

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;
    }
}

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

class AliYunPush implements Push{
    public function send(string $msg){
        // 调用接口,发送客户端推送
        // xxxxx
        return '阿里云Android&iOS推送发送成功!推送内容:' . $msg;
    }
}

class BaiduYunPush implements Push{
    public function send(string $msg){
        // 调用接口,发送客户端推送
        // xxxxx
        return '百度Android&iOS云推送发送成功!推送内容:' . $msg;
    }
}

class JiguangPush implements Push{
    public function send(string $msg){
        // 调用接口,发送客户端推送
        // xxxxx
        return '极光推送发送成功!推送内容:' . $msg;
    }
}


interface MessageFactory{
    public function createMessage();
    public function createPush();
}

class AliYunFactory implements MessageFactory{
    public function createMessage(){
        return new AliYunMessage();
    }
    public function createPush(){
        return new AliYunPush();
    }
}

class BaiduYunFactory implements MessageFactory{
    public function createMessage(){
        return new BaiduYunMessage();
    }
    public function createPush(){
        return new BaiduYunPush();
    }
}

class JiguangFactory implements MessageFactory{
    public function createMessage(){
        return new JiguangMessage();
    }
    public function createPush(){
        return new JiguangPush();
    }
}

// 当前业务需要使用阿里云
$factory = new AliYunFactory();
// $factory = new BaiduYunFactory();
// $factory = new JiguangFactory();
$message = $factory->createMessage();
$push = $factory->createPush();
echo $message->send('您已经很久没有登录过系统了,记得回来哦!');
echo $push->send('您有新的红包已到帐,请查收!');

登录后复制

说明

  • 是不是很清晰了?
  • 没错,我们有两个产品,一个是Message,一个是Push,分别是发信息和发推送
  • 抽象工厂只是要求我们的接口实现者必须去实现两个方法,返回发短信和发推送的对象
  • 你说我只想发短信不想发推送可以吗?当然可以啦,不去调用createPush()方法不就行了
  • 抽象工厂最适合什么场景?很明显,一系列相关对象的创建
  • 工厂方法模式是抽象工厂的核心,相当于多个工厂方法被放到一个大工厂中生产一整套产品(包含周边)而不是一件单独的产品

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

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

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

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

相关推荐

  • 三种php生成二维码的方法

    最简单最实例的goolge开源方法,不过反应有点慢1.google开放api代码如下:$urlToEncode="http://www.helloweba.com"; generateQRfromGoogle($urlToEncode); /** * google api 二维码生成【QRcode可以存储…

    2022年6月23日
    0141
  • PHP实现数据库主从复制的方法。

    随着业务的不断发展和业务量的不断增加,单个数据库的性能往往难以满足需求,因此数据库集群成为了一个非常重要的方向。在数据库集群中,主从复制是一个非常常见且重要的技术,通过主从复制可以将主数据库中的数据…

    2023年5月21日
    07
  • php构造函数的小结

    构造函数的小结 类定义的进一步完善

    2018年4月11日
    0185
  • php基本语法-函数

    函数的主要功能: 代码重复性使用 模块化编程 函数的定义: 定义语法: function 函数名([参数1,参数2,参数n]){        函数体;        [return;] } 调用语法: 函数名([实参1,实参2,实参n]); 函数定义及调用 例1:…

    2017年9月26日 PHP自学教程
    0226
  • 详解使用php-imap查询操作邮件收件箱

    本篇文章带大家介绍使用php-imap查询操作邮件收件箱。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。使用php-imap查询操作邮件收件箱最近在业务场景里有接收解析用户主动发送的邮件,使用php-i…

    2023年3月29日
    02
  • 重蔚php学习第二十七天——php可变变量,匿名函数

    运算符:赋值运算符,算术运算符,错误抑制符,比较运算符,逻辑运算符,三元运算符,位运算符,连接运算符,自操作运算符(在项目计算当中,非常不建议使用多个自操作一起运算) 源码反码补码 整数的原码反码和补…

    2017年5月5日 PHP自学教程
    0379
  • 如何在PHP中使用Memcache进行对象缓存。

    随着互联网应用的发展,对于性能和速度的需求也越来越高。而对于PHP开发者来说,常见的性能问题之一就是数据库查询效率。为了提高性能,我们通常会使用缓存技术,其中对象缓存就是一种常见的缓存技术之一。而在对象…

    2023年5月21日
    00
  • PHP入门指南:PHP和Prometheus。

    PHP作为一种开源的脚本语言,已经有20多年的历史。它主要被用于Web开发,特别是用于服务端的脚本。PHP的使用非常广泛,它被用于构建许多大型的Web应用程序和网站。Prometheus则是一种开源的监控系统和时间序列数据…

    2023年5月22日
    02

联系我们

QQ:951076433

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