设计模式[创建型]05--多例模式(Multiton)

一、简介

多例模式被公认为是 反面模式,为了获得更好的可测试性和可维护性,请使用『依赖注入模式』。

多例模式实际上就是单例模式的推广,是指存在一个类有多个相同实例,而且该实例都是该类本身。这个类叫做多例类。 其的特点是:

  • 多例类可以有多个实例。
  • 多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。

二、场景

  • 2 个数据库连接器,比如一个是 MySQL ,另一个是 SQLite
  • 多个记录器(一个用于记录调试消息,一个用于记录错误)

三、类结构

多例模式结构如下:

角色 简述
Multiton 一般是一个多例类或是接口

四、UML图

五、代码分析

final class Multiton
{
    const INSTANCE_1 = '1';
    const INSTANCE_2 = '2';
    /**
     * @var Multiton[]
     * 实例数组
     */
    private static $instances = [];
    /**
     * this is private to prevent from creating arbitrary instances
     * 构造方法声明为私有方法,禁止外部程序使用new实例化
     */
    private function __construct() {
    }

    // 这是获取当前类对象的唯一方式
    public static function getInstance(string $instanceName): Multiton
    {
        if (!isset(self::$instances[$instanceName])) {
            self::$instances[$instanceName] = new self();
        }
        return self::$instances[$instanceName];
    }

    /**
     * prevent instance from being cloned
     *  声明成私有方法,禁止克隆对象
     */
    private function __clone() {
    }

    /**
     * prevent instance from being unserialized
     * 声明成私有方法,禁止重建对象
     */
    private function __wakeup() {
    }
}

推荐阅读更多精彩内容