PHP设计模式-工厂方法模式

33 阅读1分钟
<?php

/**
 * 工厂模式
 */
interface message{
    public function send(string $content);
}

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

class BaiduMessage implements message{
    public function send(string $content){
        return '百度云短信:'.$content;
    }
}

abstract class MessageFactory{
    abstract protected function createFactory();
    public function getFactory(){
        return $this->createFactory();
    }
}

class AliyunFactory extends MessageFactory{
    protected function createFactory()
    {
        // TODO: Implement createFactory() method.
        return new AliyunMessage();
    }
}

class BaiduFactory extends MessageFactory{
    protected function createFactory()
    {
        // TODO: Implement createFactory() method.
        return new BaiduMessage();
    }
}

$factory = new AliyunFactory();
$message = $factory->getFactory();
echo  $message->send('南宁文旅邀你去人民公园逛一逛。。。');

这里和简单工厂就有了本质的区别,我们去掉了恶心的switch,让每个具体的实现类来进行商品对象的创建。没错,单一和封闭,每个单独的创建者子类只在工厂方法中和一个商品有耦合,有没有其他商品和其他的工厂来跟客户合作过这个子类完全不知道。

  • 和类图完全一致,基本不需要什么说明了吧,注意工厂方法模式的特点,实现推迟到了子类!!
  • 业务调用的时候需要耦合一个Factory子类。确实是这样,如果你想一个统一的出口来调用,请在外面加一层简单工厂就好啦,这就当成一道思考题吧
  • 不拘泥于目前的形式,可以不用抽象类,直接用一个接口来定义工厂方法,摒弃掉getMessage()方法,外部直接调用公开的模板方法(factoryMethod)即可

疑惑: 创建工厂这里有点麻烦,反正都是发送信息,何必直接 new AliyunMessage 方式来创建一个实例,然后调用就好。

文章来源:mp.weixin.qq.com/s/UeLrBQW6s…

感谢分享。