简单工厂
简单工厂让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。
<?php
/**
* Class IPay
* @datetime 2020/7/15 8:29 下午
* @author roach
* @email jhq0113@163.com
*/
abstract class IPay
{
/**创建订单号
* @param int $logicNum 业务编码
* @param int $userId 用户id
* @return string
* @datetime 2020/7/15 8:28 下午
* @author roach
* @email jhq0113@163.com
*/
public static function createOrderId($logicNum, $userId)
{
$prefix = (string)$logicNum.date('YmdHis').substr(microtime(), 2, 3);
if($userId < 10000) {
$suffix = str_pad((string)$userId, 4, '0', STR_PAD_LEFT);
} else {
$suffix = substr((string)$userId, -4);
}
return $prefix.$suffix;
}
/**
* @param array $params
* @datetime 2020/7/15 8:56 下午
* @author roach
* @email jhq0113@163.com
*/
abstract public function pay($params = []);
}
/**
* Class Ali
* @datetime 2020/7/15 8:58 下午
* @author roach
* @email jhq0113@163.com
*/
class Ali extends IPay
{
/**
* @param array $params
* @datetime 2020/7/15 9:04 下午
* @author roach
* @email jhq0113@163.com
*/
public function pay($params = [])
{
$orderId = self::createOrderId(1, $params['userId']);
echo $orderId.PHP_EOL;
}
}
/**
* Class Wx
* @datetime 2020/7/15 8:58 下午
* @author roach
* @email jhq0113@163.com
*/
class Wx extends IPay
{
/**
* @param array $params
* @datetime 2020/7/15 9:05 下午
* @author roach
* @email jhq0113@163.com
*/
public function pay($params = [])
{
$orderId = self::createOrderId(2, $params['userId']);
echo $orderId.PHP_EOL;
}
}
/**
* Class Factory
* @datetime 2020/7/15 9:18 下午
* @author roach
* @email jhq0113@163.com
*/
class Factory
{
/**
* @param string $name
* @return IPay
* @datetime 2020/7/15 9:18 下午
* @author roach
* @email jhq0113@163.com
*/
public static function getPayAdapter($name)
{
switch ($name) {
case 'ali':
return new Ali();
default:
return new Wx();
}
}
}
以上代码案例实现了一个支付模块业务,其中
IPay
是一个支付模块的顶层基类,Ali
和Wx
类继承了该类,Factory
是一个创建支付类的简单工厂,调用端如果想要调用支付,可以通过以下方式来实现
<?php
//使用阿里支付
Factory::getPayAdapter('ali')->pay(['userId'=> time()]);
//使用微信支付
Factory::getPayAdapter('wx')->pay(['userId'=> time()]);
简单工厂让对象的调用者和对象创建过程分离,但是当产品修改时,工厂类也要做相应的修改,比如要增加一种操作类,如求M数的N次方,就得改case,修改原有类,违背了开放-封闭原则。
在实际生产环境中,通常使用容器来做工厂,作者开源了一个功能更丰富的容器,封装在了
jhq0113/roach
中,我们可以通过composer
方式安装,代码开源地址如下
https://github.com/jhq0113/roach
jhq0113/roach
使用简单,代码精简,整个代码库纯代码大小为60K,composer
安装方式
composer require jhq0113/roach