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

来源:互联网 发布:在线阅读word js插件 编辑:程序博客网 时间:2024/06/07 06:08

我将自己学习单例模式的经历表达出来,作为自己学习的一次总结,也希望可以帮到大家。

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


学习的过程借鉴了以下博文: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();}}
特点:单个元素的枚举类,非延迟加载,反序列化


以上就是对单例模式的总结梳理,总而言之,言而总之,设计模式中单例模式涉及到的知识比较宽泛吧,不是很好理解。但是这个模式的目的是很单纯的,就是要保证类创建对象在整个生命周期只有一次。正常情况下大家跟着上面的例子来做就足够啦。






1 0
原创粉丝点击