您的位置:首页 > 其它

设计模式之单例模式

2015-12-08 22:20 363 查看
单例模式是23种设计模式中最为简单的一种。

单例模式定义

Ensure a class has only one instance, and provide a global point of access to it.

(确保某一个类只有实例,并向整个系统提供这是实例)

通常情况下,单例模式实现有两种方式。

饿汉式单例

懒汉式单例

具体实现根据实际情况不同,分为以下几种。

懒汉式单例(非线程安全)

public class Singleton {
private static Singleton instance;
private Singleton (){}

public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}


这种懒汉式是最通俗易懂的写法,一般非多线程环境下,可直接使用。

2.懒汉式单例(线程安全)

public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}


通过synchronized关键字可以保证多线程模式下,内存中实例也会只有一个。但是大部分情况下,并不需要同步,影响效率。

3.饿汉式单例

public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}


通过classloader,在类加载的时候,就会在内存中创建一个实例。不管你需不需要使用这个实例。若在某个逻辑条件下,并需要这个单例实例,就会造成内存的浪费。

4.静态内部类

public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}


这种方式与第3种方式都是利用classloader进行控制。不同的是第四种方式在装载Singleton类时,并不会去实例化单例。只有在调用getInstance方法后,才会进行加载,实现了懒加载。

5.枚举式

public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}


这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。

总结:

个人而言,如果实例对象不是很大的话,一般用第三种就可以了。

如果考虑运行时内存大小,推荐第三种,也是比较常用的一种用法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: