PHP设计模式-生成对象-简单工厂(带demo)

20 阅读1分钟

工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂

<?php

//短信接口
interface SMSInterface{
    public static function sendCode($phone, $smsCode);
}

//实现阿里短信
class AliSMS implements SMSInterface{
    public static function sendCode($phone, $smsCode) {
        return '阿里云短信验证码发送成功';
    }
}

//实现百度短信
class BaiduSMS implements SMSInterface{
    public static function sendCode($phone, $smsCode) {
        return '百度云短信验证码发送成功';
    }
}

//工厂模式创建不同的短信服务商对象
class SmsFactory
{
    /**
     * @throws Exception
     */
    public static function createSmsPlugin($smsType)
    {
        $smsObj = null;
        switch ($smsType) {
            case 'ali':
                $smsObj = new AliSMS();
                break;
            case 'baidu':
                $smsObj = new BaiduSMS();
                break;
            default:
                throw new Exception("错误短信类型");
        }
        return $smsObj;
    }
}

//发送短信业务
function sendCode($phone, $smsType) {
    //生成短信验证码
    $smsCode = mt_rand(100000, 999999);
    $smsFactory = SmsFactory::createSmsPlugin($smsType);
    return $smsFactory::sendCode($phone, $smsCode);
}


// todo:xxx指的是你存放文件SimpleFactory.php的绝对路径目录名
// php /xxx/SimpleFactory.php
$baiduResult = sendCode('18888888888', 'baidu');
echo $baiduResult . PHP_EOL;//百度云短信验证码发送成功

$aliResult = sendCode('18888888888', 'ali');
echo $aliResult . PHP_EOL;//阿里云短信验证码发送成功

总结:

1、简单工厂调用者可根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性;

2、简单工厂实例化的类具有相同的接口或者基类。

3、简单工厂需要知道所有要生成的类型,当子类比较固定基本不需要扩展时,可以使用简单工厂。当子类过多或者子类层次过多时不合适使用。

4、大部分工厂类都是以“Factory”这个单词结尾的,工厂类中创建对象的方法一般都是 create 开头,但有的也命名为 getInstance()、createInstance()、newInstance() 。不过也不是一定要这样命名,可以根据具体场景或者团队规范来命名。