單例模式(Singleton),保證一個類僅有一個實例旁理,并提供一個訪問它的全局訪問點付材。通常我們可以讓一個全局變量使得一個對象被訪問疙教,但是它不能防止你實例化多個對象。一個最好的的辦法就是伞租,讓類自身負責保存它的唯一實例贞谓。這個類可以保證沒有其他實例可以被創(chuàng)建,并且它可以提供一個訪問該實例的方法葵诈。
適用場景
當某個對象只能存在一個實例的情況下使用單例模式裸弦;
優(yōu)點
- 提供了對唯一實例的受控訪問。
- 由于在系統(tǒng)內存中只存在一個對象作喘,因此可以節(jié)約系統(tǒng)資源理疙,對于一些需要頻繁創(chuàng)建和銷毀的對象單例模式無疑可以提高系統(tǒng)的性能。
缺點
- 由于單利模式中沒有抽象層泞坦,因此單例類的擴展有很大的困難窖贤。
- 單例類的職責過重,在一定程度上違背了“單一職責原則”贰锁。
UML結構圖
SingletonPattern
源碼
SingletonA:餓漢是單例類
/**
* 單例設計模式中的餓漢式
*
* Created by zhenguo on 12/5/14.
*/
public class SingletonA {
private static SingletonA instance = new SingletonA();
private SingletonA() {
}
public static SingletonA getInstance() {
return instance;
}
}
SingletonB:懶漢是單例類
/**
* 單例設計模式中的懶漢式
*
* Created by zhenguo on 12/5/14.
*/
public class SingletonB {
private static SingletonB instance = null;
private SingletonB() {
}
public static synchronized SingletonB getInstance() {
if (instance == null) {
instance = new SingletonB();
}
return instance;
}
}
Client:客戶端調用
/**
* 單例模式客戶端調用
* 簡單說來赃梧,單例模式(也叫單件模式)的作用就是保證在整個應用程序的生命周期中,
* 任何一個時刻豌熄,單例類的實例都只存在一個(當然也可以不存在)授嘀。
*
* Created by zhenguo on 12/5/14.
*/
public class Client {
public static void main(String[] args) {
// 飽漢實現(xiàn)方式
SingletonA singletonA1 = SingletonA.getInstance();
SingletonA singletonA2 = SingletonA.getInstance();
if (singletonA1 == singletonA2) {
System.out.println("singletonA1和singletonA2是一個對象");
} else {
System.out.println("singletonA1和singletonA2不是一個對象");
}
// 餓漢實現(xiàn)方式
SingletonB singletonB1 = SingletonB.getInstance();
SingletonB singletonB2 = SingletonB.getInstance();
if (singletonB1 == singletonB2) {
System.out.println("singletonB1和singletonB2是一個對象");
} else {
System.out.println("singletonB1和singletonB2不是一個對象");
}
// 更方便的實現(xiàn)方式 待續(xù)...
}
}
設計模式系列:
創(chuàng)建型 | 結構型 | 行為型 |
---|---|---|
工廠方法 簡單工廠 抽象工廠 建造者模式 單例模式 原型模式 |
組合模式 外觀模式 橋接模式 代理模式 享元模式 適配器模式 裝飾模式 |
策略模式 模板方法 狀態(tài)模式 觀察者模式 備忘錄模式 迭代器模式 命令模式 職責鏈模式 解釋器模式 訪問者模式 中介者模式 |