单例模式(Singleton Pattern)顾名思义,通过这种模式可以保证系统中一个类只有一个实例。

作为一种常用的软件设计模式,单例模式经常被用在数据库操作、缓存、线程池等方面。因为对这些操作来说,只有一个实例很重要,可以避免很多的new操作和连接关闭等操作,减少对系统和内存资源的消耗。

单例模式主要有三个要点:

  1. 该类只能有一个实例;
  2. 它必须自行创建这个实例;
  3. 它必须向整个系统提供这个实例。

实现单例模式类的要点主要有三点:

  1. 该类只提供私有的构造函数;
  2. 类定义中含有一个该类的静态私有对象;
  3. 该类提供一个静态的公有的函数用于创建或获取它本身的静态私有对象。

实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
/**
* @Author: hongxuan
* @Date: 2016-05-11 00:45:24
* @Last Modified by: hongxuan
* @Last Modified time: 2016-05-11 01:21:00
*/

/**
* 单例模式
*/
class Singleton{
//私有静态成员变量,保存类实例
private static $_instance = null;
/**
* 私有的构造函数,只能被其自身实例化,防止外界实例化对象
*/
private final function __construct(){
echo "this is construct function";
}
/**
* 私有的__clone()方法,确保单例类不能被复制或克隆
* @return [type] [description]
*/
private function __clone(){}
/**
* 静态公有方法,创建或获取它本身的静态私有对象,是单例模式的统一访问入口
* @return Singleton 返回唯一对象实例
*/
public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance = new self;
}
return self::$_instance;
}
/**
* 类中的其它方法
* @return [type] [description]
*/
public function getName(){
echo "this is getName function";
}
}

//获取实例
$test = Singleton::getInstance();
$test->getName();

?>

使用这一模式的缺点:

  1. 每次对象请求引用都要检查类的实例是否存在,这需要一些少量的开销;
  2. 彼此间的依赖关系比较隐蔽,难以调试;
  3. 因为不能用传统的new方法来创建实例,这可能会发生开发混淆。