PHP设计模式之工厂方法模式
PHP设计模式之工厂方法模式
工厂方法模式对比简单工厂来说,最核心的一点,其实就是将实现推迟到子类。怎么理解呢?我们可以将上回的简单工厂当做父类,然后有一堆子类去继承它。createProduct()这个方法在父类中也变成一个抽象方法。然后所有的子类去实现这个方法,不再需要用switch去判断,子类直接返回一个实例化的对象即可。
实例
场景:光说不练假把式,把上回的短信发送改造改造,我们依然还是使用上回的那几个短信发送商。毕竟大家已经很熟悉了嘛,不过以后要更换也说不定,商场如战场,大家还是利益为先。这样的话,我们通过工厂方法模式来进行解耦,就可以方便的添加修改短信提供商咯。
短信发送类图
代码实现
<?php
interface Message {
public function send(string $msg);
}
class AliYunMessage implements Message{
public function send(string $msg){
// 调用接口,发送短信
// xxxxx
return '阿里云短信(原阿里大鱼)发送成功!短信内容:' . $msg;
}
}
class BaiduYunMessage implements Message{
public function send(string $msg){
// 调用接口,发送短信
// xxxxx
return '百度SMS短信发送成功!短信内容:' . $msg;
}
}
class JiguangMessage implements Message{
public function send(string $msg){
// 调用接口,发送短信
// xxxxx
return '极光短信发送成功!短信内容:' . $msg;
}
}
abstract class MessageFactory{
abstract protected function factoryMethod();
public function getMessage(){
return $this->factoryMethod();
}
}
class AliYunFactory extends MessageFactory{
protected function factoryMethod(){
return new AliYunMessage();
}
}
class BaiduYunFactory extends MessageFactory{
protected function factoryMethod(){
return new BaiduYunMessage();
}
}
class JiguangFactory extends MessageFactory{
protected function factoryMethod(){
return new JiguangMessage();
}
}
// 当前业务需要使用百度云
$factory = new BaiduYunFactory();
$message = $factory->getMessage();
echo $message->send('您有新的短消息,请查收');
说明
- 和类图完全一致,基本不需要什么说明了吧,注意工厂方法模式的特点,实现推迟到了子类!!
- 业务调用的时候需要耦合一个Factory子类。确实是这样,如果你想一个统一的出口来调用,请在外面加一层简单工厂就好啦,这就当成一道思考题吧
- 不拘泥于目前的形式,可以不用抽象类,直接用一个接口来定义工厂方法,摒弃掉getMessage()方法,外部直接调用公开的模板方法(factoryMethod)即可
了解什么是特征以及如何使用它们的最好方法是观察它们的本质