PHP设计模式笔记:单例模式(singleton)
单例模式:
保证一个类仅有一个实例,并且提供一个访问它的全局访问点
要点:
- 一个类只有一个实例
- 它必须自行创建这个实例
- 必须自行向整个系统提供这个实例
结构图:
角色:
- Singleton 角色:创建自身唯一的实例
应用场景:
- 当类有且只有一个实例并且可以全局访问
优点:
- 对唯一实例的受控访问,并且很容易扩展成多例访问
- 单例模式是对全局变量的一种改进。
跟全局变量比较:
全局变量就是对一个对象的静态引用,全局变量确实可以提供单例模式实现的全局访问这个功能,
但是,它并不能保证应用程序中只有一个实例,同时,在编码规范中,也明确指出,
应该要少用全局变量,因为过多的使用全局变量,会造成代码难读,
还有就是全局变量并不能实现继承(虽然单例模式在继承上也不能很好的处理,但是还是可以实现继承的)
而单例模式的话,其在类中保存了它的唯一实例,这个类,它可以保证只能创建一个实例,
同时,它还提供了一个访问该唯一实例的全局访问点。
<?php
/**
* 单例模式
* @author phppan
* @package design pattern
*/
/**
* 懒汉式单例类
*/
class Singleton {
/**
* 静态成品变量 保存全局实例
*/
private static $_instance = NULL;
/**
* 私有化默认构造方法,保证外界无法直接实例化
*/
private function __construct() {
}
/**
* 静态工厂方法,返还此类的唯一实例
*/
public static function getInstance() {
if (is_null(self::$_instance)) {
self::$_instance = new Singleton();
}
return self::$_instance;
}
/**
* 防止用户克隆实例
*/
public function __clone(){
die('Clone is not allowed.' . E_USER_ERROR);
}
/**
* 测试用方法
*/
public function test() {
echo 'Singleton Test!';
}
}
/**
* 客户端
*/
class Client {
/**
* Main program.
*/
public static function main() {
$instance = Singleton::getInstance();
$instance->test();
}
}
Client::main();
?>