PHP面向对象之工厂模式

MengDe 128 2021-08-14


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

废话不多说:直接展示代码(大佬勿喷,狗头保命PHP面向对象之工厂模式  php 面向对象 面向对象工厂模式 php高级之面向对象 工厂模式 面向对象模式 第1张

<?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面向对象之面向接口开发
下一篇:PHP面向对象之单例模式
相关文章