PHP实现单例模式

6 篇文章 0 订阅
1 篇文章 0 订阅

文章目录

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

  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. 单例模式如果还要其他功能诉求,可以在类中增加相应的其他类成员
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值