轉載請註明出處:http://blog.csdn.net/lhy_ycu/article/details/39784403
單例模式(Singleton):是一種常用的設計模式。在Java應用中,單例對象能保證在一個JVM中,該對象只有一個實例存在。好處主要有:1、某些類創建比較頻繁,對於一些大型的對象,這是一筆很大的系統開銷。2、省去了new操作符,降低了系統內存的使用頻率,減輕GC壓力。
單例模式主要有兩種實現方式:1、懶漢式;2、餓漢式
一、uml建模
二、代碼實現:
1、懶漢式
/**
* 示例:單例--單例對象能保證在一個JVM中,該對象只有一個實例存在。
*
* 缺點:這種做法在多線程環境下,不安全
*
* 懶漢式
*/
class Singleton {
/**
* 持有私有靜態變量(也稱類變量),防止被引用
*
* 此處賦值爲null,目的是實現延遲加載 (因爲有些類比較龐大,所以延遲加載有助於提升性能)
*/
private static Singleton instance = null;
/** 私有構造方法,防止被實例化 */
private Singleton() {
}
/** 靜態工廠方法,創建實例 --只不過這裏是創建自己,而且只能創建一個 */
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public void info() {
System.out.println("this is a test method...");
}
}
/**
* 客戶端測試類
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
/**
* 調用普通方法
*/
s1.info();
Singleton s2 = Singleton.getInstance();
/**
* 運行結果爲true,說明s1、s2這兩個類變量都指向內存中的同一個對象
*/
System.out.println(s1 == s2);
}
}
2、餓漢式
/**
* 餓漢式
*/
class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
public void info() {
System.out.println("this is a test method...");
}
}
/**
* 客戶端測試類
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
/**
* 調用普通方法
*/
s1.info();
Singleton s2 = Singleton.getInstance();
/**
* 運行結果爲true,說明s1、s2這兩個類變量都指向內存中的同一個對象
*/
System.out.println(s1 == s2);
}
}
3、如果考慮多線程,那麼getInstance()方法要加同步synchronized,這時餓漢式比懶漢式要好,儘管資源利用率要差,但是不用同步。
/**
*
* 考慮多線程的時候,下面這種做法可以參考一下:--懶漢式
*
* 在創建類的時候進行同步,所以只要將創建和getInstance()分開,單獨爲創建加synchronized關鍵字
*
* 這種做法考慮性能的話,整個程序只需創建一次實例,所以性能也不會有什麼影響。
*
* @author Leo
*/
public class SingletonTest {
private static SingletonTest instance = null;
private SingletonTest() {
}
private static synchronized void syncInit() {
if (instance == null) {
instance = new SingletonTest();
}
}
public static SingletonTest getInstance() {
if (instance == null) {
syncInit();
}
return instance;
}
}
三、總結
單例模式保證了一個類只有一個實例,且提供一個訪問全局點的方式,更加靈活的保證了實例的創建和訪問約束。系統中只有一個實例,因此構造方法應該爲私有 餓漢式:類加載時直接創建靜態實例;懶漢式:第一次需要時才創建一個實例,那麼getInstance方法要加同步 餓漢式比懶漢式要好,儘管資源利用率要差,但是不用同步。