单例模式

单模式的定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

优点

  • 由于单励模式在内存中只有一个实例,减少了内存的开支,特别是一个对象需要频繁地创建和销毁,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。

  • 由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时产生一个单对象。

使用场景

  • 创建一个对象需要消耗很多资源的,如要访问IO和数据库等资源。

  • 在整个项目中需要一个共享的访问点或共享数据,例如一个Web页面上的计数器,可以不用每次刷新都记录到数据库中,使用单例模式保持计数器的值。

单模式的如下面代码所示。

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
50
51
52
53
54
55
56
57
58
59
60
61
<?php

/**
* 懒汉式单例类
*/
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();
?>

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×