<?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…
感谢分享。