PHP设计模式 - 单例模式
单例模式是一种常见的设计模式,它的核心思想是保证一个类只有一个实例,并提供一个访问它的全局访问点。
先来定义一个类,试比较该类两次实例化后得到的对象。1
2
3
4
5
6
7
8
9
10class Singleton
{
}
$obj1 = new Singleton;
$obj2 = new Singleton;
if ($obj1 === $obj2) {
echo 'same';
} else {
echo 'not same';
}
运行程序可知,每次实例化类都将得到一个新的对象。如此,使用率较高的类每次实例化会增大内存开销。
在类中定义一个静态方法供外部调用,并设置构造方法为私有防止实例化。1
2
3
4
5
6
7
8
9
10
11
12class Singleton
{
private static $_instance = null;
private function __construct(){}
public static function getInstance()
{
if (null === self::$_instance) {
self::$_instance = new self;
}
return self::$_instance;
}
}
这样,每次使用时,只需调用此类的静态方法即可。1
$obj = Singleton::getInstance();
引用上面的代码再来看一个例子。1
2
3
4
5
6
7$obj1 = Singleton::getInstance();
$obj2 = clone $obj1;
if ($obj1 === $obj2) {
echo 'same';
} else {
echo 'not same';
}
运行可知这两对象不是同一个。因为clone的方式实际上是对整个对象的内存区域进行了一次复制并用新的对象变量指向新的内存,因此赋值后的对象和源对象相互之间是基本来说独立的。所以,一个严谨的单例应该禁止访问其克隆方法。1
2
3
4
5
6
7
8
9
10
11
12
13class Singleton
{
private static $_instance = null;
private function __construct(){}
public static function getInstance()
{
if (null === self::$_instance) {
self::$_instance = new self;
}
return self::$_instance;
}
private function __clone(){}
}