资讯专栏INFORMATION COLUMN

PHP 设计模式之一——单例模式

rubyshen / 2071人阅读

摘要:总之,我认为单例模式有最重要的两点,保证唯一以及节省资源。单例模式为了能够保持运行期间唯一并能够被全局访问,污染了全局变量。

定义

单例模式(Singleton pattern):一个类有且仅有一个实例,并且自行实例化后提供给整个程序使用。

或者可以理解为在整个程序运行期间,保证这个类有且仅一个实例,并对外提供一个能够访问它的全局访问点。

应用场景

对于一个程序来说,某些特殊的类在程序运行期间仅仅保证只被实例化一次很重要。打印服务是单例模式出镜率比较高的一个例子,对于打印机同一时刻只能打印一个文件,因此出现两个打印服务实例的时候,肯定有一个是处于闲置状态浪费资源,如果没有闲置,那么就会发生资源争夺情况,你肯定不会希望一页纸上交替打印了两个文档吧。

当你打算实现一个框架的时候,如果你是这么思考的,我要先写一个核心,其它的诸如框架配置、控制器、视图、类库等等都和这个核心有关联,这个核心从一接到请求就开始运行,一直到请求结束,所有的其它的组件都由核心来实例化,这个核心就像一个树干一样,其它的组件都像一条条树枝挂在主干上,那么这个核心类最好用单例模式,这时候你所加载的配置,你所实例化的各个组件,在本次运行期间就很确定的是由这一个核心实例化出来的(因为没有别的啦),那么不论你怎么玩也就不会发生 A 实例下的配置信息被 B 实例调用了。

总之,我认为单例模式有最重要的两点,保证唯一以及节省资源。

实现方法

把构造方法用 private 方式隐藏起来,可以防止被其它类 new 出来。

没了构造方法了,那么其它类不能 new 出来这个类了,那么只能自食其力自己 new 自己了,然而有个问题,此时自己是不存在的啊,不存在又怎么运行自己 new 自己的方法呢?

因此要使用静态方法,静态方法可以使用类直接调用,在静态方法中 new 自己,因为是在类里,所以可以无视 private 。

虽然 new 出来了,但是不保存起来的话,下次再需要时,不是还需要 new 一次 ,那么也就不是单例了,因此要找个安全的地方存起来,而静态方法只能访问静态的属性,因此把 new 出来的对象放到静态属性里吧。

class Singleton {
    private static $_instance;//保存实例化出来的单例
    //构造函数私有化,确保单例类不能通过其它对象 new 出来
    private final function __construct() {}
    //定义私有的__clone()方法,这是确保单例类不能被复制或克隆,否则又不是单例了。
    private function __clone() {}
    public static function getInstance() {
        //检测类是否被实例化,如果没有实例化,就 new 一下,已经实例化就直接返回。
        if ( ! (self::$_instance instanceof self) ) {
            self::$_instance = new test();
        }
        return self::$_instance;
    }
}

//拿到单例实例,多次调用都是同一个实例
Singleton::getInstance();
优点

提供了对唯一实例达到受控访问。

由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。

缺点

单例模式破坏了常见的类模式以及没有抽象层,因扩展时有很大的困难。

单例模式为了能够保持运行期间唯一并能够被全局访问,污染了全局变量。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25649.html

相关文章

  • 【面向对象的PHP】之模式单例

    摘要:单例模式模式系列的开篇,首先介绍的是我最喜欢的单例模式,简单而言,这属于生成一个且只生成一个对象实例的特殊类。问题良好设计的系统通过方法调用传递对象实例。面向对象设计模式目录 单例模式 模式系列的开篇,首先介绍的是我最喜欢的单例模式(Singleton),简单而言,这属于:生成一个、且只生成一个对象实例的特殊类。 这个唯一存在的类,将替代Global关键字,并且更安全。 产生前提 全局...

    崔晓明 评论0 收藏0
  • 理解php单例模式

    摘要:二为什么用单例实际项目中像数据库查询,日志输出,全局回调,统一校验等模块。单例模式的好处减少频繁创建,节省了。因此在单例模式必须包含三要素私有化构造函数,私有化。 单例作为一个最经典的设计模式之一,到底什么是单例?为什么要用单例?怎么设计单例?php中单例如何具体实现? 一、什么是单例 wiki百科:单例模式,也叫单子模式,是一种常用的软件设计模式。 在应用这个模式时,单例对象的类必须...

    xi4oh4o 评论0 收藏0
  • 大话PHP设计模式单例模式

    摘要:上面是简单的单例模式,自己写程序的话够用了,如果想继续延伸,请传送至大话设计模式之单例模式升级版 看了那么多单例的介绍,都是上来就说怎么做,也没见说为什么这么做的。那小的就来说说为什么会有单例这个模式以便更好的帮助初学者真正的理解这个设计模式,如果你是大神,也不妨看完指正一下O(∩_∩)O首先我不得不吐槽一下这个模式名字单例,初学者通过字面很难理解什么是单例,我觉得应该叫唯一模式更贴切...

    VEIGHTZ 评论0 收藏0
  • PHP设计模式-Singleton 单例(单元素)模式

    摘要:大佬看完如果发现鄙人理解有误请立即指出,感谢拍砖,跪求鞭打单例单元素模式实现来自说明通过提供对自身共享实例对访问,单元素单例设计模式用于限制特定对象只能被创建一次。 整理一下自己的学习Aaron Saray 写的PHP设计模式一些demo和自己的理解。大佬看完如果发现鄙人理解有误请立即指出,感谢拍砖,跪求鞭打 /** * Singleton 单例(单元素)模式实现 * -----...

    omgdog 评论0 收藏0

发表评论

0条评论

rubyshen

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<