简单工厂
简单工厂
简单工厂让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。
<?php
/**
* Class IPay
* @datetime 2020/7/15 8:29 下午
* @author roach
* @email [email protected]
*/
abstract class IPay
{
/**创建订单号
* @param int $logicNum 业务编码
* @param int $userId 用户id
* @return string
* @datetime 2020/7/15 8:28 下午
* @author roach
* @email [email protected]
*/
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 [email protected]
*/
abstract public function pay($params = []);
}
/**
* Class Ali
* @datetime 2020/7/15 8:58 下午
* @author roach
* @email [email protected]
*/
class Ali extends IPay
{
/**
* @param array $params
* @datetime 2020/7/15 9:04 下午
* @author roach
* @email [email protected]
*/
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 [email protected]
*/
class Wx extends IPay
{
/**
* @param array $params
* @datetime 2020/7/15 9:05 下午
* @author roach
* @email [email protected]
*/
public function pay($params = [])
{
$orderId = self::createOrderId(2, $params['userId']);
echo $orderId.PHP_EOL;
}
}
/**
* Class Factory
* @datetime 2020/7/15 9:06 下午
* @author roach
* @email [email protected]
*/
class Factory
{
public static function getPayAdapter($type)
{
switch ($type) {
case 'ali':
return new Ali();
case 'wx':
return new Wx();
default:
throw new Exception("Unknown payment type");
}
}
}
//使用阿里支付
Factory::getPayAdapter('ali')->pay(['userId' => time()]);
//使用微信支付
Factory::getPayAdapter('wx')->pay(['userId' => time()]);
简单工厂让对象的调用者和对象创建过程分离,但是当产品修改时,工厂类也要做相应的修改,比如要增加一种操作类,如求M数的N次方,就得改case,修改原有类,违背了开放-封闭原则。