工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂
<?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() 。不过也不是一定要这样命名,可以根据具体场景或者团队规范来命名。