博客专栏:二十三种设计模式之单例模式
来源:互联网 发布:在线阅读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;}}
特点:类加载时就创建对象,线程安全(不包括多个类加载器的情况)
public class Singleton {/* 类加载的时候初始化对象 */private static Singleton instance = null;/* 私有构造方法,防止被实例化 */private Singleton() {}/* 获取实例 */public static Singleton getInstance() {if(instance == null){instance = new Singleton();}return instance;}}
特点:延迟加载,在需要的时候才创建对象,线程不安全,延迟加载就是在真正需要的时候再创建对象,减少开销
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;}}
特点:线程安全,效率低,因为需要同步的时候比较少
public class Singleton {/* 私有构造方法,防止被实例化 */private Singleton() {}/* 此处使用一个内部类来维护单例 */private static class SingletonFactory {private static final Singleton instance = new Singleton();}/* 获取实例 */public static Singleton getInstance(){return SingletonFactory.instance;}}
特点:线程安全,延迟加载
public enum Singleton {/* 代表实例对象的枚举对象 */instance;/* 枚举类中的方法 */protected void print(){System.out.println("test");}/* 通过枚举的对象intance调用方法 */public static void main(String[] args){Singleton.instance.print();}}特点:单个元素的枚举类,非延迟加载,反序列化
以上就是对单例模式的总结梳理,总而言之,言而总之,设计模式中单例模式涉及到的知识比较宽泛吧,不是很好理解。但是这个模式的目的是很单纯的,就是要保证类创建对象在整个生命周期只有一次。正常情况下大家跟着上面的例子来做就足够啦。
- 博客专栏:二十三种设计模式之单例模式
- 博客专栏:二十三种设计模式之开篇
- 二十三种设计模式之单例模式
- 二十三种设计模式之一单例模式
- 二十三种设计模式之一单例模式
- java中的二十三种设计模式之1---单例模式
- 二十三种设计模式之创建型模式之单态模式
- 设计模式之二--- 单例模式
- 设计模式之单例模式(二)
- 二十三 设计模式之桥梁模式
- [设计模式]二十三种设计模式
- 黑马程序员 学习笔记——Java 二十三设计模式之单例
- 二十三种设计模式之观察者模式简述
- 二十三种设计模式之装饰者模式
- 二十三种设计模式之工厂模式
- 二十三种设计模式之命令模式
- 二十三种设计模式之适配器模式
- 二十三种设计模式之外观模式
- linux线程是否共享进程所有空间
- zookeeper
- Android中Bitmap和Drawable
- 常使用的adb命令
- 谈数据库的性能优化
- 博客专栏:二十三种设计模式之单例模式
- 修改UITextField的placeholder颜色
- Sizzle
- android-studio安装过程详解
- netty实现websocket(二)----实例
- 关于JAVA项目中CLASSPATH路径详解
- 二分法求解方程的值 matlab
- [转]Android开发实践:Java层与Jni层的数组传递
- android textview 部分文字加颜色并可点击