Java的七种单例模式

转载 2016年04月09日 22:20:26

单例模式:GOF书中给出的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例模式结构图: 
这里写图片描述

单例模式有多种写法各有利弊,现在我们来看看各种模式写法。

第一种:饿汉模式

public class Singleton {  
     private static Singleton instance = new Singleton();  
     private Singleton (){
     }
     public static Singleton getInstance() {  
     return instance;  
     }  
 }  
这种方式在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。 这种方式基于类加载机制避免了多线程的同步问题,但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到懒加载的效果。

第二种:懒汉模式(线程不安全)

public class Singleton {  
      private static Singleton instance;  
      private Singleton (){
      }   
      public static Singleton getInstance() {  
      if (instance == null) {  
          instance = new Singleton();  
      }  
      return instance;  
      }  
 } 

懒汉模式申明了一个静态对象,在用户第一次调用时初始化,虽然节约了资源,但第一次加载时需要实例化,反映稍慢一些,而且在多线程不能正常工作。

第三种:懒汉模式(线程安全)

public class Singleton {  
      private static Singleton instance;  
      private Singleton (){
      }
      public static synchronized Singleton getInstance() {  
      if (instance == null) {  
          instance = new Singleton();  
      }  
      return instance;  
      }  
 
这种写法能够在多线程中很好的工作,但是每次调用getInstance方法时都需要进行同步,造成不必要的同步开销,而且大部分时候我们是用不到同步的,所以不建议用这

种模式。
第四种:静态内部类

public class Singleton { 
    private Singleton(){
    }
    public static Singleton getInstance(){  
        return SingletonHolder.sInstance;  
    }  
    private static class SingletonHolder {  
        private static final Singleton sInstance = new Singleton();  
    }  
} 

第五种:枚举类型

public enum Singleton {  
     INSTANCE;  
     public void doSomeThing() {  
     }  
 }  

默认枚举实例的创建是线程安全的,并且在任何情况下都是单例
第六种:双重检查模式(DCL)

public class Singleton {  
      private volatile static Singleton instance;
      private Singleton (){
      }   
      public static Singleton getInstance() {  
      if (instance== null) {  
          synchronized (Singleton.class) {  
          if (instance== null) {  
              instance= new Singleton();  
          }  
         }  
     }  
     return singleton;  
     }  
 } 
第七种:使用容器实现单例模式

public class SingletonManager { 
  private static Map<String, Object> objMap = new HashMap<String,Object>();
  private Singleton() { 
  }
  public static void registerService(String key, Objectinstance) {
    if (!objMap.containsKey(key) ) {
      objMap.put(key, instance) ;
    }
  }
  public static ObjectgetService(String key) {
    return objMap.get(key) ;
  }
}

用SingletonManager 将多种的单例类统一管理,在使用时根据key获取对象对应类型的对象。这种方式使得我们可以管理多种类型的单例,并且在使用时可以通过统一的接口进行获取操作,降低了用户的使用成本,也对用户隐藏了具体实现,降低了耦合度。

设计模式(二)单例模式的七种写法

面试的时候,问到许多年轻的Android开发他所会的设计模式是什么,基本上都会提到单例模式,但是对单例模式也是一知半解,在Android开发中我们经常会运用单例模式,所以我们还是要更了解单例模式才对。...
  • itachi85
  • itachi85
  • 2016年01月17日 10:29
  • 24284

java单例模式就有6种,你知道哪几种?!

第一种: 双重查锁模式 /** * Author : Akeem * Email : zuiaisha1@126.com * Created by Akeem on 2016/3/7. ...
  • zuiasiha1
  • zuiasiha1
  • 2016年03月08日 00:13
  • 311

7种Java单例模式

单例模式 - 终极篇 单例是设计模式当中使用比较常用和重要的一种模式。在应届生笔试过程中,也会被经常要求写两个单例模式。下面是我自己总结的7中单例模式的写法,废话不多说,直接上代码:(一点点敲的,分享...
  • u010923921
  • u010923921
  • 2015年05月05日 17:00
  • 1305

设计模式之单例模式的7种写法

一、概述在介绍单例模式的写法之前,我们有必要了解一下什么是单例模式。 单例模式是一种常用的软件设计模式,在他的核心结构中只包含一个被称为 单例的特殊类。通过单例模式可以保证系统只有一个实例而且该实例易...
  • u012507894
  • u012507894
  • 2016年01月19日 11:01
  • 757

比较Java七种单例模式

参考http://cantellow.iteye.com/blog/838473 3饿汉 eager(线程安全) public class Singleton { private ...
  • u010157717
  • u010157717
  • 2013年05月23日 11:56
  • 400

Java七种单例模式

Java:单例模式的七种写法 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance...
  • java_yuchen
  • java_yuchen
  • 2017年01月04日 16:56
  • 77

Android设计模式之单例模式的七种写法

一 单例模式介绍及它的使用场景单例模式是应用最广的模式,也是我最先知道的一种设计模式,在深入了解单例模式之前,每当遇到如:getInstance()这样的创建实例的代码时,我都会把它当做一种单例模式的...
  • happy_horse
  • happy_horse
  • 2016年04月15日 19:44
  • 7380

单例模式的七种写法 (Java)

第一种(懒汉,线程不安全): public class Singleton { private static Singleton instance; private Singl...
  • wochunyang
  • wochunyang
  • 2016年11月15日 14:15
  • 208

单例模式Java的七种写法

摘要: 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。 单例模式算是开发中使用比较多的...
  • weixin_39113426
  • weixin_39113426
  • 2017年12月01日 16:23
  • 47

Java单例模式的七种写法

第一种(懒汉,线程不安全): public class Singleton { private static Singleton instance; private Singleto...
  • l1976135784
  • l1976135784
  • 2014年04月06日 14:25
  • 1071
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java的七种单例模式
举报原因:
原因补充:

(最多只允许输入30个字)