设计模式--单例模式

来源:互联网 发布:网络爬虫工具 编辑:程序博客网 时间:2024/06/06 02:20

设计模式学习笔记--单例模式的多种实现


以下实现均不考虑采用”暴力方式“获得类的实例,例如:利用发射机制调用私有的构造方法


1、简单的实现(不考虑线程安全)

public Class Singleton{<pre code_snippet_id="216969" snippet_file_name="blog_20140304_6_5334752" name="code" class="java">    private static Singleton instance = null;<pre code_snippet_id="216969" snippet_file_name="blog_20140304_3_4177727" name="code" class="java">    private Singleton(){ }<pre code_snippet_id="216969" snippet_file_name="blog_20140304_4_34052" name="code" class="java">    public  static Singleton getInstance(){      if( instance == null)        instance = new Singleton ();      return instance;   }}


2、简单的添加关键字 synchronized 实现线程安全(不考虑系统开销),每次有线程调用getInstance()方法,都需要同步判断。

public Class Singleton{<pre code_snippet_id="216969" snippet_file_name="blog_20140304_6_5334752" name="code" class="java">  private static Singleton instance = null;<pre code_snippet_id="216969" snippet_file_name="blog_20140304_7_1506722" name="code" class="java">  private Singleton(){ }<pre code_snippet_id="216969" snippet_file_name="blog_20140304_9_1267524" name="code" class="java">  public  static synchronized  Singleton getInstance(){     if( instance == null)        instance = new Singleton ();     return instance;  }}


3、采用 双检查法 实现线程安全:

public class DoubleCheckedLockingSingleton{<pre code_snippet_id="216969" snippet_file_name="blog_20140304_10_1583952" name="code" class="java">   
     private volatile DoubleCheckedLockingSingleton INSTANCE;      private DoubleCheckedLockingSingleton(){}      public DoubleCheckedLockingSingleton getInstance(){         if(INSTANCE == null){            synchronized(DoubleCheckedLockingSingleton.class){                if(INSTANCE == null){                    INSTANCE = new DoubleCheckedLockingSingleton();                }            }         }         return INSTANCE;     }}

4、采用 延时初始化 实现(对性能要求较高时不太可取,兼具了实现 1 和 2 的功能)

public class Singleton {       private static class SingletonHolder{               private static Singleton instance = new Singleton();    }<pre code_snippet_id="216969" snippet_file_name="blog_20140304_12_6328244" name="code" class="java">    private Singleton(){ }<pre code_snippet_id="216969" snippet_file_name="blog_20140304_13_6644671" name="code" class="java">    public static  Singleton getInstance(){        return SingletonHolder.instance;    }}


5、采用 枚举 实现(线程安全的同时还进性了序列化)

枚举实例的创建默认是线程安全的,可以通过Singleton.INSTANCE 访问该单例

public enum Singleton {  <pre code_snippet_id="216969" snippet_file_name="blog_20140304_15_3340812" name="code" class="java">    INSTANCE("demo") { <pre code_snippet_id="216969" snippet_file_name="blog_20140304_16_7560934" name="code" class="java">        public void Methods() {              // . . .          }      };        protected abstract void Methods();  }

6、采用 静态工程模式 实现(线程安全 由 JVM 负责实现)

public class Singleton{      private static final Singleton INSTANCE = new Singleton();     private Singleton(){}     public static Singleton getSingleton(){        return INSTANCE;    }}





0 0
原创粉丝点击