问:什么是单例模式?
单例模式(Singleton):用于为一个类生成一个[全局][唯一]的对象:目的是复用以及不可修改性,可以理解为全局静态变量(从语言层面,任何对象都是一种有较复杂数据结构的变量)
举例:最常用的地方是数据库连接。 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。可以看出实现单例的一个隐藏的细节,就是访问控制,即private,protect,public的使用
单例模式(singleton)有三个特点
1、一个类只能有一个实例
2、它必须自行创建这个实例
3、它必须自行向整个系统提供这个实例
/**
* 单例类
* Singleton.class
*/
class Singleton
{
/**
* 静态成品变量 保存全局实例
*/
private static $_instance = NULL;
/**
* 私有化默认构造方法,保证外界无法直接实例化
*/
private function __construct()
{
}
/**
* 静态工厂方法,返还此类的唯一实例
*/
public static function getInstance() {
if (is_null(self::$_instance)) {
self::$_instance = new Singleton();
// 或者这样写
// self::$_instance = new self();
}
return self::$_instance;
}
/**
* 防止用户克隆实例
*/
public function __clone(){
die('Clone is not allowed.' . E_USER_ERROR);
}
/**
* 测试用方法
*/
public function test()
{
echo 'Singleton Test OK!';
}
}
/**
* 客户端
*/
class Client {
/**
* Main program.
*/
public static function main() {
$instance = Singleton::getInstance();
$instance->test();
}
}
Client::main();
具体应用:
在laravel框架的初始化过程中大量使用单例模式,初始化了一些核心服务