單例模式(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方法要加同步 餓漢式比懶漢式要好,盡管資源利用率要差,但是不用同步。
- 前言
- (一)策略模式建模與實現
- (二)觀察者模式建模與實現
- (三)裝飾者模式建模與實現
- (四)工廠方法模式建模與實現
- (五)抽象工廠模式建模與實現
- (六)單例模式建模與實現
- (七)命令模式建模與實現
- (八)適配器模式建模與實現
- (九)外觀模式建模與實現
- (十)模板方法模式建模與實現
- (十一)迭代器模式建模與實現
- (十二)組合模式建模與實現
- (十三)狀態模式建模與實現
- (十四)代理模式建模與實現
- (十五)建造者模式建模與實現
- (十六)原型模式建模與實現
- (十七)橋接模式建模與實現
- (十八)責任鏈模式建模與實現
- (十九)備忘錄模式建模與實現
- (二十)解釋器模式建模與實現
- (二十一)享元模式建模與實現
- (二十二)中介者模式建模與實現
- (二十三)訪問者模式建模與實現
- Java設計模式博客全目錄