001-PHP设计模式之单例模式

一、单例模式

1.1什么是单例模式

单例模式,顾名思义,就是这个类只存在一个实例;不管有多少 new 操作,都只返回同一个对象;其根本目的就是减少 new 操作,以及在一些场景下保证不同类操作的都是同一个实例,保证数据一致;

1.2为什么使用单例模式

  1. 当应用中存在大量的 sql 请求,需要用到大量 new 操作来创建 mysql 实例;这样会大大增加 mysql 的连接数。造成 too many connections 警告;
    此时使用单例模式就可以极大减少 mysql 的连接

  2. 如果系统需要使用一个类来全局控制某些配置信息,那么,使用单例可以更方便实现;因为这就保证了全部都是操作的同一个对象,数据不会出现差异;
    例子,在 FIBA 3x3 字幕系统中,使用 timer 类来控制时间时,应为在不同的地方做了实例操作,导致每次操作的 timer 对象都不一样,创建了多个 setinterval 定时器,造成时间出现混乱

  3. 日志应用时,设置单例可以避免不同实例对同一个文件进行追加,导致内容难以追加

1.3怎么实现单例模式

遵循:三私一公,私有构造方法,私有 __clone 复制,私有实例对象,公开实例化方法,还有一个私有化,私有 __wakeup 重建(为了防反序列化)

php 是不支持饿汉式单例的,因为成员变量在初始化赋值时,只能是定值或常量,不能是变量、表达式或者函数调用

/**
 * 懒汉式单例
 * 优点:节约空间,没有使用时,是不会创建实例的
 * 缺点:线程不安全
 */
class lazySingleton
{
    private static $instance; // 实例对象私有化
    private function __construct(){}  // 构造方法私有化
    private function __clone(){} // 防止克隆
    private function __wakeup(){} // 防止序列化

    // 公开实例化对象方法
    public static function getInstance()
    {
        if (!self::$instance instanceof self) {
            self::$instance = new self;
        }
        return self::$instance;
    }
}

$obj = lazySingleton::getInstance();

1.4单例模式优点是什么

  1. 确保一实例,保证了在其他类使用时,数据都是一致的;用于:类作为全局配置时

  2. 单例模式具有一定的伸缩性,类只可以控制实例的创建

  3. 在频繁的创建和销毁对象的场景中,单例是个很好的选择,节约资源

  4. 避免对资源的多重占用

1.5单例模式缺点是什么

  1. 单例模式中没有抽象层,因此单例类的拓展有很大的困难

  2. 单例类的职责过重,不符合“单一职责原则”

  3. 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失

1.6PHP 单例模式的不足原因

PHP 是解释型脚本语言,这种运行机制就使得php页面被解释后,所有的相关资源就会被回收;也就是说,php无法在语言级别上使某个对象常驻内存;java
的单例是会一直存在于整个应用程序的生命周期,变量是跨页面级别的,真正的做到实例在应用程序生命周期中是唯一的;然而在PHP中,所有的变量无论是全
局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义
了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值