设计模式学习笔记--单例模式的多种实现
以下实现均不考虑采用”暴力方式“获得类的实例,例如:利用发射机制调用私有的构造方法
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;
}
}