Loading

PHP实现单例模式

文章目录

定义:单例模式是一种类的设计,只会最多产生一个对象的设计思想

  1. 首先定义一个空类,叫做Singleton

    <?php
    class Singleton {
    
    }
    
  2. 禁止实例化,只禁止在类外部实例化对象,私有化构造方法

    class Singleton
    {
        // 私有化构造方法
        private function __construct()
        {
            echo __METHOD__,'<br>';
      
        }
    }
    
  3. 这样外部就不能进行实例化对象,意味着不能产生对象了,此时只能想办法在还没有产生对象的时候进入到“类内部”,意味着只能通过静态方法让类直接进入到类的内部

    // 在上述类中增加公有静态方法
    public static function getInstance()
    {
    
    }
    
  4. 进入类内部以然还是没有对象,此时需要在静态方法内部进行对象实例化,并且把得到的对象返回到外部

    public static function getInstance() {
    	return new self();
    }
    
    // 外部获取对象
    $s = Singleton::getInstance();
    
  5. 第一次可以示例化对象,但是还是可以通过访问静态方法依旧可以实例化新的对象,此时返回数据需要静态属性

    class Singleton
    {
        // 静态属性,保存生产出来的对象
        private static $object = null;  // 初始化为null,没有对象
    
        // 私有化构造方法
        private function __construct()
        {
            echo __METHOD__,'<br>';
        }
    
        // 类入口,允许类进入类内部
        public static function getInstance()
        {
            // 判断静态属性是否存在当前类的对象
            if (!self::$object instanceof self) {
                // 当前保存的object数据不是Singleton的对象
                // 产生对象
                self::$object = new self();
            }
            // 返回对象
            return self::$object;
        }
    }
    
    // 用静态方法进入到类内部
    $s = Singleton::getInstance();
    var_dump($s);
    
  6. 此时可以保证外部无论多少次调用公有静态方法获取实例,都会只得到一个对象。但是此时外部对象依然可以产生新的对象:因为克隆,所以还必须禁止对象的克隆,即在类内部私有化克隆方法。

    // 在类中添加私有化的__clone()方法
    private function __clone(){}
    

总结

  1. 单例模式就是设计的类最多只能得到一个对象
  2. 单例模式的设计规范就是“三私一公”
    • 私有化构造方法:禁止在类外无线实例对象
    • 私有化克隆方法:禁止对象无限克隆对象
    • 私有化静态数据:保存类内部实例化得到的对象
    • 公有静态方法:允许外部通过调用类内部方法获取对象
  3. 单例模式的目的是为了保护资源的唯一性
  4. 单例模式如果还要其他功能诉求,可以在类中增加相应的其他类成员
posted @ 2019-10-14 19:53  无解的程序员or码农  阅读(159)  评论(0编辑  收藏  举报