极简设计模式-多例模式

多例模式 - Multiton Pattern

定义

多例是单例的一种延伸。是指一个类有多个相同实例,而且该实例都是该类本身。

设计的原则和思想

  1. 解耦了对象的创建和使用。
  2. 不变部分是使用,变化部分是创建。
  3. 核心思想是限制对象的数量,并且对对象进行重复使用。

一句话概括设计模式

一个类有多种形态,并且每一种形态是一个单例。

结构中包含的角色

Multiton 多例对象

最小可表达代码

final class Multiton
{
    private static $instanceNum = 3;
    private static $instances = [];

    // 不能创建实例
    private function __construct(){}

    // 不能克隆
    private function __clone(){}

    // 不能序列化
    private function __wakeup(){}

    // 获取实例
    public static function getInstance() : self
    {
        self::initInstances();

        return self::$instances[rand(0, self::$instanceNum - 1)];
    }

    // 初始化多个实例
    public static function initInstances()
    {
        if (count(self::$instances) <= 0) {
            for ($i = 0; $i < self::$instanceNum; $i++) {
                self::$instances[$i] = new static();
            }
        }
    }
}

$multiton = Multiton::getInstance();
var_dump($multiton);

实际应用场景

  1. 多个数据库连接器。MySQL,SQLite,redis, mongo…
  2. 多个记录器。记录调试消息,记录错误消息,记录普通消息
  3. VIP用一个数据库,普通用户用另外一套数据库。
  4. Laravel的Request类,每个请求都会有不同的参数,所以这里就是多例。
本作品采用《CC 协议》,转载必须注明作者和本文链接
Long2Ge
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!