图片来自:http://www.ngchina.com.cn/
单例模式:也叫单态模式(好像各个地方都是叫单例!),是一种常用的软件设计模式。这个模式规定单例对象的类必须保证这个类只能有一个实例的存在,并提供一个访问它的全局访问点 ( 就算new,也只能让你new一个对象,毕竟国内是一夫一妻制 ) 。
应用场景:
- 数据库连接器
- 日志程序(一般都是采用单例模式)
- 配置对象
- 多线程的线程池
- 等等......
由于这个东西不是什么新奇的玩意,我就结合高手的和我自己的理解实例说明下这个东西怎么玩:
一切代码中解释
// 私有化
class test
{
// 完全私有化这个构造函数,就不让你用
private function __construct()
{
//
}
}
// 暴露一个接口给外部访问
class test
{
private function __construct()
{
//
}
public static function getInstance()
{
//
}
}
// 返还对象
class test
{
private function __construct()
{
//
}
public static function getInstance()
{
return new test(); // 要对象?没关系国家给发
}
}
// 判断唯一性
class test
{
private function __construct()
{
//
}
public static function getInstance()
{
$obj = ""
if(empty($obj) // 是不是领过对象了?
{
$obj = new test();
}
return $obj;
}
}
// 设置静态:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销
class test
{
private static $obj; // 私密的
private function __construct()
{
//
}
public static function getInstance()
{
if(empty(self::$obj))
{
self::$obj = new test();
}
return self::$obj;
}
}
// 防止克隆
class test
{
private static $obj; // 私密的
private function __construct()
{
//
}
// 暴露给外部, getInstance算是一个小规范
public static function getInstance()
{
/* 用一个静态变量存储的实例,
* 只有第一次实例化的时候才赋值,
*/ 以后都直接给出静态示例
if(empty(self::$obj))
{
self::$obj = new test();
}
return self::$obj; // 返回原配
}
// 根据法律龟腚 禁止克隆对象
private __clone()
{
//
}
}
$t1 = test::getInstance(); // 获取这个实例化对象
$t2 = test::getInstance();
var_dump($t1===$t2); // true
参考资料: