zoukankan      html  css  js  c++  java
  • 单例模式

    1. 为什么需要单例模式,解决的问题是什么

    众所周知,全局变量捆绑于特定的环境中, 破坏了封装。 一旦你的系统依赖于全局变量, 早晚都会发生冲突。

    简单说来,单例模式就相当于一个可控的全局变量。

    2. 实现1

    class Singleton
    {
    private static $instance = null;

    public static function getInstance()
    {
    if(self::$instance === null) {
    self::$instance = new static();
    }
    return self::$instance;
    }

    private function __construct(){}
    }

    不管调用多少次$single = Singleton::getInstance()都只会生成一个Singleton对象, 一切看起来很完美, 但凡看过射雕英雄传的对 裘千仞 裘千丈 这对双胞胎兄弟应该很有印象, 裘千仞:坐拥铁掌帮,一手铁掌功夫了得, 但是裘千丈凭借着一样的外表, 在很大时候也具有这样的权利, 对code来说这是非常危险的。

    当有人对实例化出来的singleton对象进行clone $single的时候, clone的类也具有了singleton类的功能, 不再是全局唯一的了。
    对这种情况, 我们只要在上述类中提供一个私有的__clone方法就好了。
    private function __clone(){}

    OK, 现在$single对象看起来坐拥了Singleton的无限财富, 谁也偷不走。

    但是人生也会有很多无奈事, 虽家财万贯,但是出了一个败家子, 奈何呜呼哀哉。

    如果有一个类继承了Singleton, 再重写了__construct方法, 把__construct改成了public,  这下又出大事了, 居然再一次可以实例化了

    那简单, 直接把类设为final不就行了, 哈哈哈。。。太聪明了, 仔细想想, 感觉哪里不大对, 这是要绝后啊!!!还是只对private方法加上final表示不能重写

    最终版本
    class Singleton
    {
    private static $instance = null;

    public static function getInstance()
    {
    if(self::$instance === null) {
    self::$instance = new static();
    }
    return self::$instance;
    }

    final private function __construct(){}

      final private function __clone(){}

    //当然还要注意不被反序列化
    final private function __wakeUp(){}
    }

    使用场景:

    1. 当做全局变量使用

    2. 只需要实例化一次的类

  • 相关阅读:
    DBAccess
    业务耗时及数组
    QB资料学习.01
    格式化参数
    日志记录.02_线程处理
    nginx 开启gzip
    js 变量提升和函数提升
    js 深拷贝 vs 浅拷贝
    js 伪数组 转 数组
    js 对象原型和原型链
  • 原文地址:https://www.cnblogs.com/by-pgp/p/6196831.html
Copyright © 2011-2022 走看看