简单工厂

简单工厂

简单工厂

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

<?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,修改原有类,违背了开放-封闭原则。

Read more

超棒的雅思资源!

超棒的雅思资源!

雅思真题材料地址: https://github.com/zeeklog/IETLS 感谢所有人。材料来自:@shah0150 & @kbtxwer * 超棒的雅思资源 * 雅思简介 * 听力 * 阅读 * 写作 * 口语 * 词汇 * 其他 * YouTube 频道 * [播客] (#podcasts) 雅思简介 * 什么是雅思 - 了解什么是雅思 听力 * 高级听力 * 雅思官方网站 * 考试英语 * 英国广播公司节目 * 乔治梅森大学口音学习网站 - 学习不同的口音 * 英国广播公司播客 * 英国文化协会听力练习 阅读 * 雅思提升阅读 写作 * 雅思提升写作 * 雅思从 6 分到 9 分 * 迷你雅思 口语 * Verbling 提供在线英语家教服务

By Ne0inhk
🚀Zeek.ai一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器

🚀Zeek.ai一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器

是一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器。 集成了 SearXNG AI 搜索、开发工具集合、 市面上最流行的 AI 工具门户,以及代码编写和桌面快捷工具等功能, 通过模块化的 Monorepo 架构,提供轻量级、可扩展且高效的桌面体验, 助力 AI 驱动的日常工作流程。

By Ne0inhk