PHP 设计模式系列 —— 多例模式(Multiton)

1、模式定义

多例模式和单例模式类似,但可以返回多个实例。比如我们有多个数据库连接,MySQL、SQLite、Postgres,又或者我们有多个日志记录器,分别用于记录调试信息和错误信息,这些都可以使用多例模式实现。

2、UML类图

多例模式

3、示例代码

Multiton.php

<?php

namespace DesignPatterns\Creational\Multiton;

/**
 * Multiton类
 */
class Multiton
{
    /**
     *
     * 第一个实例
     */
    const INSTANCE_1 = '1';

    /**
     *
     * 第二个实例
     */
    const INSTANCE_2 = '2';

    /**
     * 实例数组
     *
     * @var array
     */
    private static $instances = array();

    /**
     * 构造函数是私有的,不能从外部进行实例化
     *
     */
    private function __construct()
    {
    }

    /**
     * 通过指定名称返回实例(使用到该实例的时候才会实例化)
     *
     * @param string $instanceName
     *
     * @return Multiton
     */
    public static function getInstance($instanceName)
    {
        if (!array_key_exists($instanceName, self::$instances)) {
            self::$instances[$instanceName] = new self();
        }

        return self::$instances[$instanceName];
    }

    /**
     * 防止实例从外部被克隆
     *
     * @return void
     */
    private function __clone()
    {
    }

    /**
     * 防止实例从外部反序列化
     *
     * @return void
     */
    private function __wakeup()
    {
    }
}

学院君 has written 881 articles

Laravel学院院长,终身学习者

积分:99627 等级:P12 职业:码农 城市:杭州

5 条回复

  1. alukaa alukaa says:
    多例模式除了框架用作service container 之外,还有没有其他的应用场景,暂时没想到
  2. 颜造城 颜造城 says:
    @ Ann子尘 单例模式 用多了 你就会知道要用多例模式
  3. wang wang says:
    看的明白说明,看的明白代码,但不能深刻理解多例模式的使用场景,或又可以在外部创建该实例的数组。 这就是我所欠缺的吧,代码能写,档次不够?
  4. 星空 星空 says:
    噢?这里与单例的区别就是Instance是一个数组,该数组存有多种不同的实例对吧?

登录后才能进行评论,立即登录?