<?php
interface Message{
public function send(string $content);
}
class BaiduMessage implements Message{
public function send(string $content)
{
// TODO: Implement send() method.
return '百度云短信:'.$content;
}
}
class AliyunMessage implements Message{
public function send(string $content)
{
// TODO: Implement send() method.
return '阿里云短信:'.$content;
}
}
interface Push{
public function send(string $content);
}
class BaiduPush implements Push{
public function send(string $content)
{
// TODO: Implement send() method.
return '百度推送:'.$content;
}
}
class AliyunPush implements Push{
public function send(string $content)
{
// TODO: Implement send() method.
return '阿里云推送:'.$content;
}
}
/**
* 一个工厂接口有两个实力,一个是信息,一个是推送
*/
interface Factory{
public function createMessage();
public function createPush();
}
class BaiduFactory implements Factory{
public function createMessage()
{
// TODO: Implement createMessage() method.
return new BaiduMessage();
}
public function createPush()
{
// TODO: Implement createPush() method.
return new BaiduPush();
}
}
class AliyunFactory implements Factory{
public function createMessage()
{
// TODO: Implement createMessage() method.
return new AliyunMessage();
}
public function createPush()
{
// TODO: Implement createPush() method.
return new AliyunPush();
}
}
$factory = new AliyunFactory();
$message = $factory->createMessage();
echo $message->send('免费开放!!!!');
$push = $factory->createPush();
echo $push->send('嘿,免费!!!!');
其实说简单点,真的就是在一个工厂类中通过不同的方法返回不同的对象而已。
- 是不是很清晰了?
- 没错,我们有两个产品,一个是Message,一个是Push,分别是发信息和发推送
- 抽象工厂只是要求我们的接口实现者必须去实现两个方法,返回发短信和发推送的对象
- 你说我只想发短信不想发推送可以吗?当然可以啦,不去调用createPush()方法不就行了
- 抽象工厂最适合什么场景?很明显,一系列相关对象的创建
- 工厂方法模式是抽象工厂的核心,相当于多个工厂方法被放到一个大工厂中生产一整套产品(包含周边)而不是一件单独的产品
文章来源:mp.weixin.qq.com/s/8IgYen6Qx… 感谢分享。