设计模式之单例模式

单例模式是23种设计模式中最为简单的一种。

单例模式定义

Ensure a class has only one instance, and provide a global point of access to it.
(确保某一个类只有实例,并向整个系统提供这是实例)


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

  • 饿汉式单例
  • 懒汉式单例

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

  1. 懒汉式单例(非线程安全)
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特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。

总结:
个人而言,如果实例对象不是很大的话,一般用第三种就可以了。
如果考虑运行时内存大小,推荐第三种,也是比较常用的一种用法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值