设计模式之单例模式

设计模式之单例模式,第1张

设计模式之单例模式 1、单例模式的定义

确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
以下代码中,singleton = new Singleton(); 指的就是自行实例化。

public class Singleton {

    private static final Singleton singleton = new Singleton();

    // 限制只能有一个实例
    private Singleton(){

    }
    // 通过get方法获取实例
    public static Singleton getSingleton() {
        return singleton;
    }

    public void doSomeThing(){

    }
}
2、单例模式的优缺点 2.1 优点

因存在中只有一个实例,减少了内存的开支。若一个对象需要频繁的创建与销毁,且性能无法优化时,可以考虑使用单例模式。

因存在中只有一个实例,减少了系统的性能消耗,若一个对象的产生需要较多的资源时,如产生其他的依赖对象。则可以产生一个单例对象,使其永久的存在内存中来解决。

避免资源重复占用,比如写文件

设置全局访问点,比如工具类

2.2 缺点

单例模式因需要自行实例化,因此一般没有接口或抽象类,扩展困难。单例模式与单一职责原则冲突。 3 使用场景

共享数据的访问点,比如页面计数器,不需要每次都记录到数据库中创建一个对象需要过多的资源,并且经常用到时需要定义大量的静态常量和静态方法,比如工具类 4 注意事项

高并发模式下防止产生多个示例的线程安全问题。

public class Singleton {

    private static final Singleton singleton = null;

    // 限制只能有一个实例
    private Singleton(){

    }
    // 通过get方法获取实例
    public static Singleton getSingleton() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

以上代码在高并发的情况下就有可能生成两个或多个实例。解决的方法有很多,比如用第一张图的饿汉式单例或双重检测机制来解决。
  需要注意对象的复制情况,最好的方法就是不实现Cloneable接口
  另外还需要注意垃圾回收机制,如果一个单例对象在内存中长期未使用,JVM会认为这个对象是个垃圾,空闲时将其收掉。下次调用时会创建一个新的出来,会失去原有的状态,导致应用出错。可以由容器管理单例的生命周期得以解决,比如Java EE容器、sping容器

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5707603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存