1. 云栖社区>
  2. PHP教程>
  3. 正文

浅入理解单例模式

作者:用户 来源:互联网 时间:2017-11-30 13:57:03

模式理解

浅入理解单例模式 - 摘要: 本文讲的是浅入理解单例模式,问题恼人的全局变量在 PHP 中,甚至不只 PHP 中,我们都会用到全局变量,以保存全局状态。可是,往往全局变量是全局共享的,任何地方任何代码都有可能将其覆盖。例如,我们定义一个全局变量叫做 PHONE。我们在某一行代码中,将其定义成了 i

问题
恼人的全局变量

PHP 中,甚至不只 PHP 中,我们都会用到全局变量,以保存全局状态。可是,往往全局变量是全局共享的,任何地方任何代码都有可能将其覆盖。例如,我们定义一个全局变量叫做 PHONE。我们在某一行代码中,将其定义成了 iPhone,但是我们不小心在另一行代码中将其覆写成了 Nokia。这就非常的尴尬了,因为本来我们并不想它被覆写。


繁琐的参数传递

在一个系统中,我们会定义许多的方法,生成很多的对象。有时候,我们会使用很多的方法,对同一个对象做操作。在不使用全局变量的情况下,我们需要将对象作为参数传入方法中。但是这样传递同一个对象,可能会造成混乱,还可能造成不必要的依赖。


其实我们只需要一个全局可访问的对象就可以解决这个,但是全局变量又会出现我们上面的说的问题。


解决
目标

我们要解决这些问题,我们对这样的对象有下面的几个目标。

这个对象,无论在哪里都能访问,就想全局变量一样。
这个对象,和全局变量不同,不能被覆写。
这个对象,整个系统中只存在一个,对它的修改在整个系统中都能被感知到。

以上的几个目标,就是我们所需要的,也就是单例模式的特征。


UML

浅入理解单例模式-


实现
class Preference
{
private static $instance;
private $props = [];private __construct() {}public static function getInstance()
{
if (empty(self::$instance)) {
self::$instance = new Preference();
}return self::$instance;
}public function setProperty($key, $value)
{
$this->props[$key] = $value;
}public function getProperty($key)
{
return $this->props[$key];
}
}

我们在这里引入了一个私有的构造函数,这样,外部就无法实例化这个对象了。同时,我们使用 getInstance 方法来获取具体的实例,而无法去覆写它,这就达成了第二个目标。


由于 $instance 和 getInstance 都是静态的,所以我们可以通过 Preference::getInstance() 访问,具体的实例。这样就使得全局都可以访问到它了,它就像全局变量一样了,这就达成了第一个目标了。


对于这个类,我们无法生成第二个对象,因为它的构造函数是私有的,而且,getInstance 在判断已经有了一个实例的情况下默认返回该实例。这就达成了第三个目标了。


这就是单例模式。


后记

对于单例模式,其实没有那么高大上。只不过是更改的对象的访问范围,以及对象始终存在,仅此而已。


最后,本文章是作者在学习设计模式时的感想。部分参考自《深入 PHP 面向对象、模式与实践(第 3 版)》。如有错误,感谢大神不吝赐教。

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索模式 理解 ,以便于您获取更多的相关知识。