zoukankan      html  css  js  c++  java
  • 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. 单例模式如果还要其他功能诉求,可以在类中增加相应的其他类成员
  • 相关阅读:
    js4——字符转化
    js3——表格下拉
    笔记展现
    js2——定时跳转
    js学习——1
    明明在/etc/my.cnf 配置了mysql.sock,为什么会在/var/lib/mysql/mysql.sock 里边寻找
    RBAC用户权限管理数据库设计
    mysql 字节问题,中文和数字
    PHP闭包
    一致性哈希算法原理
  • 原文地址:https://www.cnblogs.com/wxvirus/p/12896767.html
Copyright © 2011-2022 走看看