设计模式 _第一招式_单例模式

版权声明:做一个有尊严的生产者 https://blog.csdn.net/qq_36918149/article/details/82357137

一、定义
单例模式(Singleton Pattern)是一个比较简单的模式,确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

二、代码演示
Singleton 类称为单例类,通过使用private的构造函数确保在一个应用中只产生一个实例,并且自行实例化,单例(饱汉式)通用源代码如下:

public class Singleton {
    private  static Singleton singleton = new  Singleton ();
    //限制通过构造函数,产生多个实例
    private Singleton(){}

    //通过该方法获得实例对象
    public static Singleton getSingleton(){
        return  singleton ;
    }

    //其它方法尽量是static
    public static void doSomething(){
    }
}

三、优点

  1. 由于单例在应用中只有一个实例,减少了内存开支,特别是一个对象频繁的创建销毁时,而且创建销毁实例无法优化,单例的优势非常明显。
  2. 由于单例只生成一个实例,所以减少了性能开销,当一个对象的产生需要较多资源时如读取配置、产生其它依赖对象时,则可以在启动应用时候,直接产生一个单例对象,然后永久驻留内存中(在java ee 使用单例时,需要注意JVM垃圾回收机制)。
  3. 单例可以避免资源多重占用,例如写一个文件动作,由于只有一个实例存在,避免同一个资源文件被重复处理。
  4. 单例模式可以在系统设置全局的访问点,优化和共享资源访问, 如可以设计一个单例类负责所有数据表的映射处理。

四、缺点

  1. 单例模式一般没有接口,扩展困难,若要扩展,除了修改代码基本上没有第二种途径。单例模式为什么没有接口?单例模式要求“自行实例化”,接口或抽象类不能实例化。
  2. 单例模式对测试是不利的,在并行开发环境,如果没有完成单例类,是不能进行测试的,没有接口不能使用mock的方式虚拟一个对象。

五、应用场景

  1. 要求生产唯一序号环境;
  2. 在项目中需要一个共享访问点或共享数据,如一个web项目中的计数器,可以不将数据保存到数据库,使用单例模式保存计数器的值,并确保是线程安全的;
  3. 创建一个对象需要消耗的资源过多, 如访问IO和数据库等资源;
  4. 需要定义大量的静态常量和静态方法(工具)的环境;

六、注意事项

  1. 在高并发时,请注意单例模式的线程同步问题,如下是线程不安全的单例(懒汉式):
 public class Singleton {
    private  static Singleton singleton = null;
    //限制通过构造函数,产生多个实例
    private Singleton(){}
    //通过该方法获得实例对象
    public static Singleton getSingleton(){
        if (singleton == null){
            return  new Singleton() ;
        }
        return singleton ;
    }
    //其它方法尽量是static
    public static void doSomething(){
    }
}

解决线程不安全的方法很多, 一般加synchronized关键字来实现。
2. 需要考虑对象复制的情况,在java中,对象默认是不可以被复制的,如要Cloneable接口,并实现了clone方法,则可以直接通过对象复制的方式创建一个新对象,对象复制不是调用类的构造函数,因此即使是私有的构造函数,对象仍然可以被复制。一般情况下,类复制的情况不用考虑,很少有类出现一个单例类会主动要求被复制,解决此问题最好的方法是,单例类不要事先Cloneable接口。

猜你喜欢

转载自blog.csdn.net/qq_36918149/article/details/82357137