多例模式 - Multiton Pattern
定义
多例是单例的一种延伸。是指一个类有多个相同实例,而且该实例都是该类本身。
设计的原则和思想
- 解耦了对象的创建和使用。
- 不变部分是使用,变化部分是创建。
- 核心思想是限制对象的数量,并且对对象进行重复使用。
一句话概括设计模式
一个类有多种形态,并且每一种形态是一个单例。
结构中包含的角色
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); |
实际应用场景
- 多个数据库连接器。MySQL,SQLite,redis, mongo…
- 多个记录器。记录调试消息,记录错误消息,记录普通消息
- VIP用一个数据库,普通用户用另外一套数据库。
- Laravel的Request类,每个请求都会有不同的参数,所以这里就是多例。