单例模式

来源:互联网 发布:轰趴馆 知乎 编辑:程序博客网 时间:2024/05/16 17:56

一句话定义:

确保一个类只有自我创建的单独实例并提供接口供整个系统使用。

使用场景:

避免产生多个对象消耗过多的资源(类似数据库的连接);某种类型的对象有且只有一个类型(生成唯一序列号)。

实现要点:

1. 构造函数私有化2. 提供静态方法接口访问3. 保证访问线程安全4. 防止序列化导致重新生成实例对象

常用实现方式:

1.饿汉式

public class Singleton {      private static Singleton mInstance = new Singleton();    private Singleton(){}    public static Singleton getInstance(){        return mInstance;    }}  
常见的方式,实现简单。

2.DCL 双重校验锁

public class Singleton {      private static Singleton mInstance = null;    private Singleton(){}    public static Singleton getInstance(){        if (mInstance  == null){            synchronized (Singleton.class){                if (mInstance  == null){                    mInstance = new Singleton();                }            }        }        return mInstance;    }}  
实现复杂,但是安全性高。

3.静态内部类

public class Singleton {      private static class SingletonHolder {          private static final Singleton INSTANCE = new Singleton();      }      private Singleton (){}      public static final Singleton getInstance() {          return SingletonHolder.INSTANCE;      }  }   
与DCL同样安全,但不会发生DCL失效问题,推荐使用。

4.枚举

public enum Singleton{    INSTANCE;    public void doWhat(){}}
反序列化不会重新生成对象,同时线程安全。上述其余方式必须加入如下方法可不重新生成对象。
private Object readResolve() throws ObjectStreamException{    return mInstance;}

补充内容: 静态域 与 实例域

域 : 应该叫做 field。也就是我们常说的类的 属性~。
public class demo{    static int A;    int B;}
如上: A 为静态域,即静态属性,有static修饰; B 为实例域,即普通属性,构建实例时创建。
0 0
原创粉丝点击