PHP设计模式--抽象工厂模式

31 阅读1分钟
<?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… 感谢分享。