作者简介:

       姜海强:闷骚码农,互联网行业摸爬滚打数余载,先后担任中国体育直播TV主程、网信集团先锋支付架构师、奇虎360服务器端资深开发。热爱技术,喜欢分享,热衷领域:PHP/Golang语言、面向对象设计模式、Redis、Yaf、Yii2、微服务等。

视频课程

yaf+yar微服务-腾讯课堂
yaf+yar微服务-51CTO学院
CSDN学院

Github

个人主页
swoole-boot
roach
roach-orm

QQ群:

姜海强的QQ群

公众号:

360tryst公众号

简单工厂

简单工厂让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。

  1. <?php
  2. /**
  3. * Class IPay
  4. * @datetime 2020/7/15 8:29 下午
  5. * @author roach
  6. * @email jhq0113@163.com
  7. */
  8. abstract class IPay
  9. {
  10. /**创建订单号
  11. * @param int $logicNum 业务编码
  12. * @param int $userId 用户id
  13. * @return string
  14. * @datetime 2020/7/15 8:28 下午
  15. * @author roach
  16. * @email jhq0113@163.com
  17. */
  18. public static function createOrderId($logicNum, $userId)
  19. {
  20. $prefix = (string)$logicNum.date('YmdHis').substr(microtime(), 2, 3);
  21. if($userId < 10000) {
  22. $suffix = str_pad((string)$userId, 4, '0', STR_PAD_LEFT);
  23. } else {
  24. $suffix = substr((string)$userId, -4);
  25. }
  26. return $prefix.$suffix;
  27. }
  28. /**
  29. * @param array $params
  30. * @datetime 2020/7/15 8:56 下午
  31. * @author roach
  32. * @email jhq0113@163.com
  33. */
  34. abstract public function pay($params = []);
  35. }
  36. /**
  37. * Class Ali
  38. * @datetime 2020/7/15 8:58 下午
  39. * @author roach
  40. * @email jhq0113@163.com
  41. */
  42. class Ali extends IPay
  43. {
  44. /**
  45. * @param array $params
  46. * @datetime 2020/7/15 9:04 下午
  47. * @author roach
  48. * @email jhq0113@163.com
  49. */
  50. public function pay($params = [])
  51. {
  52. $orderId = self::createOrderId(1, $params['userId']);
  53. echo $orderId.PHP_EOL;
  54. }
  55. }
  56. /**
  57. * Class Wx
  58. * @datetime 2020/7/15 8:58 下午
  59. * @author roach
  60. * @email jhq0113@163.com
  61. */
  62. class Wx extends IPay
  63. {
  64. /**
  65. * @param array $params
  66. * @datetime 2020/7/15 9:05 下午
  67. * @author roach
  68. * @email jhq0113@163.com
  69. */
  70. public function pay($params = [])
  71. {
  72. $orderId = self::createOrderId(2, $params['userId']);
  73. echo $orderId.PHP_EOL;
  74. }
  75. }
  76. /**
  77. * Class Factory
  78. * @datetime 2020/7/15 9:18 下午
  79. * @author roach
  80. * @email jhq0113@163.com
  81. */
  82. class Factory
  83. {
  84. /**
  85. * @param string $name
  86. * @return IPay
  87. * @datetime 2020/7/15 9:18 下午
  88. * @author roach
  89. * @email jhq0113@163.com
  90. */
  91. public static function getPayAdapter($name)
  92. {
  93. switch ($name) {
  94. case 'ali':
  95. return new Ali();
  96. default:
  97. return new Wx();
  98. }
  99. }
  100. }

以上代码案例实现了一个支付模块业务,其中IPay是一个支付模块的顶层基类,AliWx类继承了该类,Factory是一个创建支付类的简单工厂,调用端如果想要调用支付,可以通过以下方式来实现

  1. <?php
  2. //使用阿里支付
  3. Factory::getPayAdapter('ali')->pay(['userId'=> time()]);
  4. //使用微信支付
  5. Factory::getPayAdapter('wx')->pay(['userId'=> time()]);

简单工厂让对象的调用者和对象创建过程分离,但是当产品修改时,工厂类也要做相应的修改,比如要增加一种操作类,如求M数的N次方,就得改case,修改原有类,违背了开放-封闭原则。

在实际生产环境中,通常使用容器来做工厂,作者开源了一个功能更丰富的容器,封装在了jhq0113/roach中,我们可以通过composer方式安装,代码开源地址如下

https://github.com/jhq0113/roach

jhq0113/roach使用简单,代码精简,整个代码库纯代码大小为60K,composer安装方式

  1. composer require jhq0113/roach

QQ群:

姜海强的QQ群

公众号:

360tryst公众号