您的位置:首页 > 其它

博客专栏:二十三种设计模式之单例模式

2016-04-05 11:17 281 查看
我将自己学习单例模式的经历表达出来,作为自己学习的一次总结,也希望可以帮到大家。

我觉得这样子的一个学习过程比较合适,我会先将单例模式的五种形式给出来,然后再进行剖析。

学习的过程借鉴了以下博文:http://tedyin.me/2016/03/13/singlton-pattern/

在看到这篇文章之前,我只了解到前面的几种单例模式,后面的枚举是看了文章才知道的,这篇文章后面有介绍说枚举用法是《Effective Java》这本书中推荐的用法,博主还没看这本书,工作中枚举用到的次数也是寥寥无几。

总之,单例模式可以分为五类:饿汉,懒汉,双重锁,内部类,枚举类型。

因为我水平有限,所以文章内容主要是整理、梳理博主收集到的资料,希望能够梳理自己学习到的知识,同时又能在不误导新手的前提下与大家共同分享。

再稍微罗嗦几句,单例模式的精髓在于确保该对象是单例类的唯一实例,这是出发点,过程中需要考虑到实例化对象的问题、延迟加载的问题、线程同步的问题、垃圾回收的问题(这一点我不讲,因为我根本就不了解)、对象序列化的问题。

这种东西真的涉及好多方面,需要考虑很多很多东西,限于水平,只讲正常情况下的特点,不做展开。

1、饿汉模式

public class Singleton {
/* 类加载的时候就创建实例 */
private static Singleton instance = new Singleton();

/* 私有构造方法,防止被实例化 */
private Singleton() {
}

/* 获取实例 */
public static Singleton getInstance() {
return instance;
}
}

特点:类加载时就创建对象,线程安全(不包括多个类加载器的情况)

2、懒汉模式
public class Singleton {
/* 类加载的时候初始化对象 */
private static Singleton instance = null;

/* 私有构造方法,防止被实例化 */
private Singleton() {
}

/* 获取实例 */
public static Singleton getInstance() {
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
特点:延迟加载,在需要的时候才创建对象,线程不安全,延迟加载就是在真正需要的时候再创建对象,减少开销

3、双重锁模式
public class Singleton {
/* 类加载的时候初始化对象 */
private static Singleton instance = null;

/* 私有构造方法,防止被实例化 */
private Singleton() {
}

/* 获取实例 */
public static Singleton getInstance() {
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
特点:线程安全,效率低,因为需要同步的时候比较少

4、静态内部类模式
public class Singleton {
/* 私有构造方法,防止被实例化 */
private Singleton() {
}
/* 此处使用一个内部类来维护单例 */
private static class SingletonFactory {
private static final Singleton instance = new Singleton();
}
/* 获取实例 */
public static Singleton getInstance(){
return SingletonFactory.instance;
}
}
特点:线程安全,延迟加载

5、枚举模式
public enum Singleton {
/* 代表实例对象的枚举对象 */
instance;

/* 枚举类中的方法 */
protected void print(){
System.out.println("test");
}

/* 通过枚举的对象intance调用方法 */
public static void main(String[] args){
Singleton.instance.print();
}
}特点:单个元素的枚举类,非延迟加载,反序列化

以上就是对单例模式的总结梳理,总而言之,言而总之,设计模式中单例模式涉及到的知识比较宽泛吧,不是很好理解。但是这个模式的目的是很单纯的,就是要保证类创建对象在整个生命周期只有一次。正常情况下大家跟着上面的例子来做就足够啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息