PHP设计模式--简单工厂

46 阅读1分钟
<?php
interface message{
    public function send(string $content);
}

class AliyunMessage implements message{
    public function send(string $content){
        return  '阿里云发送短信:'.$content;
    }
}

class JDMessage implements message{
    public function send(string $content){
        return  '京东发送短信:'.$content;
    }
}

class Factory{
    public static function createMessage($type){
        $message = null;
        switch ($type){
            case 'Aliyun':
                $message = new AliyunMessage();
                break;
            case 'JD':
                $message = new JDMessage();
                break;
        }
        return $message;
    }
}
$message = Factory::createMessage('JD');
echo $message->send('你好,今天有一份邮政快递需要你签收。');
  • createMessage一定要使用static?不一定,看自己业务情况决定,需要常驻的全部static,按需实例化的就new完了再正常->去调用
  • 三个message子类一定需要实现接口?也不一定,php本身就是弱类型语言,可以不去强制实现,但使用接口更加符合面向对象的规范(请参考多态),简单工厂本身其实是对多态的一种表述和应用
  • 当需要增加发送消息的渠道时,添加新类继承Message接口,实现send()方法,修改Factory()中createFactory()方法里的switch
  • 思考上述修改违背了面向对象的什么原则?(提示:开放XX)
  • 实例中没有使用返回值类型?本身这也是新语法,对于老版本兼容来说可以不需要去写,但是如果公司技术栈已经升级到7以上的话,建议这种设计模式架构类的代码还是按照上方解释中的新特性写法去书写,也就是带上参数类型和返回值类型,更加的符合规范,也更容易理解
  • 实例中传错了$type返回NULL怎么办?亲,实际写代码的时候请处理好这个问题哟,返回一个默认的,或者上层捕获都是不错的解决方案,当然最好客户端那边提前判断好,没问题了再进工厂吧

文章来源:mp.weixin.qq.com/s/k_4AOqnW4… 感谢老师分享,这里仅作记录