本篇文章主要介绍单例模式。
概念
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
优点
- 实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 - 灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
示例
Demo1
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
/**
* Singleton 单例类
*
* @auther hongker
* @date 2018-12-24
*/
class Singleton
{
/**
* 实例变量
* @var mixed
*/
private static $instance = null;
/**
* 获取实例
* @return Operate
*/
public static function getInstance()
{
if (self::$instance == null) {
self::$instance = new Operate();
}
return self::$instance;
}
}
/**
* Operate 实际操作类
*/
class Operate
{
/**
* 具体函数
*/
public function doSomething() :void
{
echo "do something..\r\n";
}
}
// 调用方式
$instance = Singleton::getInstance();
$instance->doSomething();使用以上的模式,对外提供
Singleton::getInstance()
方法,避免暴露实例化Operate
类。Demo2
因为$instance
是个静态变量,仅需初始化一次,便可随处适用。但不适合包含可变属性值的场景。如下: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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/**
* Singleton 单例类
*
* @auther hongker
* @date 2018-12-24
*/
class Singleton
{
/**
* 实例变量
* @var mixed
*/
private static $instance = null;
/**
* 获取实例
* @return Operate
*/
public static function getInstance()
{
if (self::$instance == null) {
self::$instance = new Operate();
}
return self::$instance;
}
}
/**
* Operate 实际操作类
*/
class Operate
{
/**
* 操作名称
* @var string
*/
private $name;
/**
* 具体函数
*/
public function doSomething() :void
{
echo "do something..\r\n";
}
/**
* 获取名称
* @return string
*/
public function getName() : string
{
return $this->name;
}
/**
* 设置名称
* @param string $name 操作名称
*/
public function setName(string $name):void
{
$this->name = $name;
}
}
// 第一次获取实例
$instance1 = Singleton::getInstance();
$instance1->setName("get");
echo "instance1->getName: {$instance1->getName()}\r\n";
// 第二次获取实例
$instance2 = Singleton::getInstance();
$instance2->setName("post");
echo "instance2->getName: {$instance2->getName()}\r\n";
// 此时实例1的name属性也会发生变动
echo "instance1->getName: {$instance1->getName()}\r\n";输出如下:
1
2
3instance1->getName: get
instance2->getName: post
instance1->getName: post
通过这两个实例可以很好的理解单例模式的适用方式,在实际开发过程中,还有很多的场景适用单例模式,但也有不适用的,所以需要多思考。
- 本文作者: Hongker
- 本文链接: https://hongker.github.io/2018/12/24/单例模式/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!