php设计模式之单例模式

单例模式

単例模式就是某个类只有一个实例,自行实例化并向整个系统提供这个实例

単例模式的实现:
1:私有化一个属性用于存放唯一的实例
2:私有化构造方法
3:私有化克隆方法,用来创建并只允许创建一个实例
4:公有化静态方法,用于向系统提供这个唯一实例
<?php
class Singleton {
    //1.私有化属性存放实例
    private static $_instance = null;

    //2.私有化构造方法
    private function __construct() {

    }

    //3.克隆方法私有化
    private function __clone() {
        // TODO: Implement __clone() method.
    }

    //4.公有化静态方法,用于向系统提供这个唯一实例
    public function getInstance() {
        //如果不是当前类的实例,那么实例化当前类创建新实例
        if(!self::$_instance instanceof self){
            self::$_instance = new self();
        }
        return self::$_instance;
    }
}

$obj1 = Singleton::getInstance();
$obj2 = Singleton::getInstance();
$obj3 = Singleton::getInstance();

var_dump($obj1,$obj2,$obj3);
#输出
object(Singleton)#1 (0) {
}
object(Singleton)#1 (0) {
}
object(Singleton)#1 (0) {
}

因为静态方法可以在全局范围内被访问,当我们需要一个单例模式的对象时,只需调用getInstance方法,获取先前实例化的对象,无需重新实例化。

因为静态方法可以在全局范围内被访问,当我们需要一个单例模式的对象时,只需调用getInstance方法,获取先前实例化的对象,无需重新实例化。

优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

使用场景: 1、要求生产唯一序列号。 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

注意事项:getInstance() 方法中需要使用同步锁 synchronized 防止多线程同时进入造成 instance 被多次实例化

上一篇 php设计模式之工厂模式
下一篇 php设计模式之注册树模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容