PHP面向对象之工厂模式

MengDe5个月前PHP471


什么是面向对象的工厂模式,他到底有什么好处?今天从一个例子带你来体验一下。

废话不多说:直接展示代码(大佬勿喷,狗头保命

<?php
/**
 * @author MengDe <9258405@qq.com>
 * @date   2021/8/13 9:45
 * 工厂模式案例
 */
//面向对象 我们要遵循开闭原则:扩展开发,修改是封闭的
//我们这里使用短信接口作为距离 目前最火的为腾讯短信接口和阿里云短信接口
interface SMS
{
    public function send();
}

//服务端代码开始
class ali implements SMS
{
    public function send()
    {
        // TODO: Implement send() method.
        echo "发送阿里短信";
    }

}

class tx implements SMS
{
    public function send()
    {
        // TODO: Implement send() method.
        echo "发送腾讯短信";
    }
}

//简单的工程模式,何为简单的工程模式
class JdSmsFactory
{
    public static function initParam($type)
    {
        if ($type == 'tx') {
            return new ali();
        } else if ($type == 'ali') {
            return new tx();
        } else {
            throw new Exception('缺少类型');
        }
    }
}

//客户端不知道有哪些类目 只知道对方开放了一个
//JdSmsFactory::initParam的方法
//该方法允许传递短信接口名称
$ali = JdSmsFactory::initParam('ali');
$ali->send();

$tx = JdSmsFactory::initParam('tx');
$tx->send();

//如果此时 有一个新的小众的接口 例如百度云短信接口
//我们需要去增加 肯定就是要去修改initParam方法
//这就违反了我们的开闭原则:对于扩展是开放的,对于修改是关闭的(扩展方法不要去动之前的代码)
//所以 我们需要引入工厂模式
interface SmsFactory
{
    //创建一个工厂接口 里面有个方法 创建接口
    public function createSms();
}

//此时 我们就需要新建两个列
class aliFactory implements SmsFactory
{
    public function createSms()
    {
        // TODO: Implement createSms() method.
        return new ali();
    }

}

class txFactory implements SmsFactory
{
    public function createSms()
    {
        // TODO: Implement createSms() method.
        return new tx();
    }

}

//客户端如何使用?
$fact = new aliFactory();
$sms = $fact->createSms();
$sms->send();

$fact = new txFactory();
$sms = $fact->createSms();
$sms->send();

//我们不需要关注具体是哪家的接口 而我们只需要知道 使用这个工厂就能够获得一个sms类 并且这里面有send方法
//如果多了一个百度云的如何实现
class baidu implements SMS
{
    public function send()
    {
        // TODO: Implement send() method.
        echo "发送百度短信";
    }

}

class bdFactory implements SmsFactory
{
    public function createSms()
    {
        // TODO: Implement createSms() method.
        return new baidu();
    }
}
$fact = new bdFactory();
$sms = $fact->createSms();
$sms->send();

//对于客户端来说:好处显而易见,在增加其他同类型的接口 百度 华为 等或者其他小众接口(指代同一类产品 例如数据库 缓存等等都可以)
//我们只需要写一个配置文件来获取到底使用那个工厂 就可以而并不用再次修改其他逻辑下面的逻辑
//对于服务端来说 每次只需要新增 而并不需要去修改之前的类


相关文章

PHP面向对象之单例模式

何为单例模式,他的使用场景?他有哪些特点?让我来告诉你。如何实现一个单例模式的类,只需要四步:1.禁止外部new操作2.给外部开放获取方法3.禁止子类继承修改构造函数4.禁止克隆如何实现:<?p...

PHP面向对象详解

1-1面向对象简介项目代码应该有单个能够起子程序作用的对象组成目标:重用性灵活性扩展性1-2类(Class)与对象(Obj)类生成对象使用new 关键字来生成对象类里面有属性和方法:属性:public...

分润释放积分的方法

分润释放积分的方法

原题:新用户送100固定资产推荐一人送100固定资产固定资产-》可用资产释放规则:普通用户每天千分之1,黄金用户前五十天每天千分之三,后面都是千分之2数据库截图:代码:  publ...

使用google authenticator(谷歌身份验证器)打造用户登录动态口令-原博客文章搬运

文章源地址:https://blog.csdn.net/netsec_steven/article/details/53301168?locationNum=11&fps=1google au...

Fastadmin安装过程中遇到的问题-Bower

Fastadmin安装过程中遇到的问题-Bower

因项目需求,所以需要使用fastadmin框架,首次安装,服务器上面缺少了Bower,但是安装的过程中遇到一些问题。git 我就不必说了,在第三步的时候需要安装Bower 我刚开始以为是直接使用yum...

PHP算法之冒泡算法

冒泡算法:  原理:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 ...