网上有很多标准解释,我这里做个小白一点的解释(因为我是个小白)。
前提:php每次new obj()都会在内存中重新申请一块内存存放,就是每次new了之后都是一个新的对象
单例模式
单例模式简单理解就是一个类不需要重新进行new,当第一次创建对象后,在当前进程中使用的都是第一次创建的对象
特点
1、需要一个保存类的唯一实例的私有静态成员变量
2、构造函数必须声明为私有的,防止外部程序new一个对象从而失去单例的意义
3、克隆函数必须声明为私有的,防止对象被克隆
4、必须提供一个访问这个实例的公共静态方法(通常命名为getInstance),从而返回唯一实例的一个引用。
单例类示例
<?php
// 单例
class singleton{
// 保存全局实例
private static $instance;
// 私有化构造方法,禁止当前类被new
private function __construct(){
echo "Singleton is created";
}
// 私有化clone方法,在此我不做演示
private function __clone(){}
// 对外提供获取实例的方法
public static function getInstance(){
if(!isset(self::$instance)){
self::$instance = new singleton();
}
return self::$instance;
}
}
调用
<?php
// 使用单例,看效果
require_once('./singleton.php');
// 调用两次看效果
singleton::getInstance();
singleton::getInstance();
结果
可以看到单例类的构造方法只触发了一次
多例模式
对单例有简单的理解后,多例就好理解了,简单说多例就是多个单例
多例类示例
<?php
// 多例
class multiton{
// 保存全局实例
private static $instance;
// 私有化构造方法,禁止当前类被new
private function __construct(int $number){
echo "{$number}th created".PHP_EOL;
}
// 私有化clone方法
private function __clone(){}
// 对外提供获取实例的方法
public static function getInstance(int $number){
if(!isset(self::$instance[$number])){
self::$instance[$number] = new multiton($number);
}
return self::$instance[$number];
}
}
调用
<?php
require_once('./multiton.php');
multiton::getInstance(1);
multiton::getInstance(2);
结果
可以看到多例类的构造方法触发了两次
小结
单例/多例要结合实际应用场景,在我看来只是个实现结果的想法。