看了那么多单例的介绍,都是上来就说怎么做,也没见说为什么这么做的。那小的就来说说为什么会有单例这个模式以便更好的帮助初学者真正的理解这个设计模式,如果你是大神,也不妨看完指正一下O(∩_∩)O
首先我不得不吐槽一下这个模式名字“单例”,初学者通过字面很难理解什么是单例,我觉得应该叫“唯一”模式更贴切,下面会有我的理由。再往下看之前强烈建议先搞明白PHP中“类”的概念以及实现方式。
单例模式的意义
设计单例模式的主要目的是防止已经实例化的对象不被再次实例化(啥叫实例化?兄弟你去百度吧),比如我已经实例化了一个类,等下次我再用此类的时候,会直接返回之前实例化的结果,而不会重新实例化一个新对象。
那么问题来了,这样有啥好处呢?其实你机器性能无限大的时候,这种模式没什么卵用,有这个模式就是当代计算机原理造成的,当我们实例化一个类的时候,电脑会分配一个内存供你使用,说到这应该明白了吧,多次new同一个类会很浪费内存,而且与这个内存相关的东西可能都会多一份,比如说网络连接数等等,总之同样的事别麻烦同一个类,不然类也会很累。。。
单例模式的举例
此时应该上代码,典型的教科书式的代码
class singleMode {
//用来指向已创建好的实例
public static $instance;
//判断是否已经创建过实例
public static function getInstance()
{
//注意!最关键的代码在这
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
这就是一个简单的单例模式,其实就是多了一个if用来判断$instance有没有值,有的话就直接返回$instance,没有就实例化一个新的,这样就避免了重复实例化的目的。
这里还有一个比较重要的概念,我看了很多的文章都没提及,就是static的声明,这个也是必须的条件之一。
为了能全面的理解代码,我们来说说static的作用,有耐心(无聊)的请往下继续看。没有的可以忽略了下面了,其实单例已经说的差不多了。
这里不得不又要提及当代计算机的原理了,来看看程序是怎么运行的:
当我们编写代码的时候,全部内容都储存在计算机的硬盘里,这时什么都没发生,和什么CPU,内存等都没半毛钱关系。当程序运行时,代码才产生作用(好像是废话)。代码运行到new Class的时候,计算机会分配给程序一个内存,当用完的时候内存要被回收。static的声明让计算机知道,这是一个静态变量,这个变量会随着内存分配时一并加载到内存里,这样程序运行的结果就被保留了下来,所以当我们下一次访问getInstance()这个方法时,里面的$instance才会有值。如果不声明static,那么$instance变量就不会常驻内存,而是用的时候才被赋值,这样就没有了继承性。
回到开头,为什么说叫“唯一”模式比较适合呢,因为单例单从字面上理解是单独的例子,并不能说明是独一无二的,但是唯一只有一个是吧。
上面是简单的单例模式,自己写程序的话够用了,如果想继续延伸,请传送至大话PHP设计模式之单例模式升级版