您现在的位置是:网站首页 > 心得笔记

工厂模式

盛悦2022-04-20550人围观
简介场景:使用工厂模式接入:阿里短信验证、腾讯短信验证、百度短信验证

创建类文件

BaseSMS.php – 基础短信服务接口类

AliSMS.php – 阿里短信服务类

BaiduSMS.php – 百度短信服务类

TencentSMS.php – 腾讯短信服务类

SmsBusiness.php – 短信业务逻辑类


具体代码

BaseSMS.php – 基础短信服务接口类

interface BaseSMS
{
    public static function sendCode($phone, $code);
}
AliSMS.php – 阿里短信服务类

class AliSMS implements BaseSMS
{
	public static function sendCode($phone, $code){
		// 阿里云短信服务代码
		// TODO
		return '阿里云短信验证码发送成功';
	}
}
BaiduSMS.php – 百度短信服务类

class BaiduSMS implements BaseSMS
{
	public static function sendCode($phone, $code){
		// 百度云短信服务代码
		// TODO
		return '百度云短信验证码发送成功';
	}
}
TencentSMS.php – 腾讯短信服务类

class TencentSMS implements BaseSMS
{
	public static function sendCode($phone, $code){
		// 腾讯云短信服务代码
		// TODO
		return '腾讯云短信验证码发送成功';
	}
}
SmsBusiness.php – 短信业务逻辑类

class SmsBusiness
{
	public static function sendCode($phone, $len = 4, $type){
		// 生成短信验证码
		$code = mt_rand(1000,9999); // 默认为4位数验证码
		if ($len == 4){ // 长度为4,则生成4位数验证码
			$code = mt_rand(100000,999999);
		}
		
		// 工厂模式创建不同的短信服务商
		$smsObj = null;
		switch($type){
			case 'ali':
				$smsObj = new AliSMS();
			break;
				case 'baidu':
				$smsObj = new BaiduSMS();
			break;
				case 'tencent':
				$smsObj = new TencentSMS();
			break;
		}
		
		$sms = $smsObj::sendCode($phone, $code);
		if ($sms) {
            // 成功:把短信验证码记录到 redis, 并且设置失效时间
            cache(config('stores.redis.prefix') . $phone, $code, config('stores.redis.expire'));
        }
		return true;
	}
}
最后,控制器调用 业务逻辑层短信发送验证码服务

class SMSController {
	public function code (){
		$phone = request()->param('phone_number', '', 'trim');
		
		/*
		* 这里是参数验证,略
		*/
		
		// 调用业务逻辑层的sendCode
        if (SmsBusiness::sendCode($phone, config('code.code.length'), 'ali')){
            return show(config('status.success'), '验证码发送成功');
        }
        return show(config('status.error'), '验证码发送失败');
	}
}



实际工作中经常使用的是:对于数据量很大的列表,需要根据需求选择维度小的作为查询主连接

public listByParams($params['orderStatus'])
{
	switch ((int)$params['orderStatus']) {
		case 1://已审核
		case 2://未审核
			$data = OrderExt::getListByStatus($params['orderStatus']);
			break;
		case 3://未签协议
		case 4://已签协议
			$data = ProtocolStudent::getListByStatus($params['orderStatus']);
		default;
	}
}


上一篇:单例模式

下一篇:Linux基础学习