博客专栏:二十三种设计模式之单例模式
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();
}
}特点:单个元素的枚举类,非延迟加载,反序列化
以上就是对单例模式的总结梳理,总而言之,言而总之,设计模式中单例模式涉及到的知识比较宽泛吧,不是很好理解。但是这个模式的目的是很单纯的,就是要保证类创建对象在整个生命周期只有一次。正常情况下大家跟着上面的例子来做就足够啦。
我觉得这样子的一个学习过程比较合适,我会先将单例模式的五种形式给出来,然后再进行剖析。
学习的过程借鉴了以下博文: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();
}
}特点:单个元素的枚举类,非延迟加载,反序列化
以上就是对单例模式的总结梳理,总而言之,言而总之,设计模式中单例模式涉及到的知识比较宽泛吧,不是很好理解。但是这个模式的目的是很单纯的,就是要保证类创建对象在整个生命周期只有一次。正常情况下大家跟着上面的例子来做就足够啦。
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- 新注册
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Lua编程示例(二):面向对象、metatable对表进行扩展
- 四大漏洞入侵博客
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- C#中面向对象编程机制之多态学习笔记
- 浅谈Lua的面向对象特性
- Lua面向对象之类和继承浅析