定義
保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn)。
屬于創(chuàng)建型
適用場(chǎng)景
想確保任何情況下都絕對(duì)只有一個(gè)實(shí)例。(屬性配置,應(yīng)用池)
優(yōu)點(diǎn)
在內(nèi)存里只有一個(gè)實(shí)例,減少了內(nèi)存開銷。
可以避免對(duì)資源的多重占用。
設(shè)置全局訪問(wèn)點(diǎn),嚴(yán)格控制訪問(wèn)。
缺點(diǎn)
沒(méi)有接口,擴(kuò)展困難
重點(diǎn)
私有構(gòu)造器
線程安全
延遲加載
序列化和反序列化安全
防止反射攻擊
必要條件
1、擁有一個(gè)私有的靜態(tài)實(shí)例,該實(shí)例禁止外部訪問(wèn)
2、擁有私有的默認(rèn)構(gòu)造函數(shù),防止使用構(gòu)造函數(shù)進(jìn)行實(shí)例化
3、擁有一個(gè)靜態(tài)工廠方法,并且必須是同步的,防止多線程環(huán)境同時(shí)執(zhí)行
4、重寫clone()函數(shù),并返回當(dāng)前實(shí)例對(duì)象,默認(rèn)的clone()函數(shù)會(huì)創(chuàng)建新的實(shí)例
Coding(懶漢模式)
package design.creational.singleton;
public class LazySingleton {
private static LazySingleton lazySingleton = null;
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (lazySingleton == null) {
synchronized (LazySingleton.class) {
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
}
}