单例模式

意图

保证一个类仅有一个实例,并提供访问它的全局访问点

适用性

  • 当类只能有一个实例,而且客户可以从一个众所周知的访问点访问它
  • 当这个唯一的实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时

我的理解:
单例模式主要用于只能创建一个对象实例的场景,如db类,文件类,cache类这些,防止过多的连接造成资源的浪费。

结构

singleton

代码示例

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
testsingleton();
class singleton{
private static $object = null;
protected function __construct() {
print "create object\n";
}
public static function getInstance()
{
if(self::$object == null)
{
self::$object = new singleton();
}
return self::$object;
}
private function __clone(){}
private function __wakeup(){}
}
function testsingleton()
{
$object = singleton::getInstance();
$object2 = singleton::getInstance();
echo $object === $object2 ? "one object" : 'tow object';
echo PHP_EOL;
}

明显特征

1公(getInstance)4私(object,__construct,__clone,__wakeup)

  1. 定义了一个public类型的用来返回对象的方法,只能通过该方法生成对象
  2. 定义了一个人private的私有属性,代表具体的类对象,只能通过public方法获得
  3. 非public的构造函数,不可直接new对象,如果__construct是共有的,就意味着可以使用new创建对象,这样会产生不同的对象
  4. 为了防止使用clone复制对象,使用unserialize反序列化得到对象,需要将clone和wakeup对象重新定义为两个什么都不做的私有方法。

参考文献

1.单例模式
2.Php中的单例模式面面观