單例模式:
保證一個(gè)類只有一個(gè)實(shí)例稻励,并且提供一個(gè)全局訪問(wèn)點(diǎn)。
使用場(chǎng)景:
單例模式只允許創(chuàng)建一個(gè)對(duì)象,因此節(jié)省內(nèi)存粤攒,加快對(duì)象訪問(wèn)速度,因此在對(duì)象需要被公用的情況下使用適合使用
單例優(yōu)點(diǎn):
- 只有一個(gè)實(shí)例囱持,節(jié)約內(nèi)存
- 只創(chuàng)建一次夯接,加快訪問(wèn)速度。
- 提供了對(duì)唯一實(shí)例的受控訪問(wèn)纷妆。
- 避免對(duì)共享資源的多重占用盔几。
缺點(diǎn):
- 單利模式中沒(méi)有抽象層,因此單例類的擴(kuò)展有很大的困難掩幢。
- 單例類的職責(zé)過(guò)重逊拍,在一定程度上違背了“單一職責(zé)原則”。
單例模式的幾種實(shí)現(xiàn)方式:
- 餓漢模式:
在類加載時(shí)就完成了初始化粒蜈,所以類加載較慢顺献,但獲取對(duì)象的速度快
package headFirst.Singleton;
/**
* @author zhaokai008@ke.com
* @date 2019-07-21 00:04
*/
public class Hungry {
private static Hungry instance = new Hungry();
private Hungry (){
}
public static Hungry getInstance() {
return instance;
}
}
- 懶漢模式(線程不安全)
在用戶第一次調(diào)用時(shí)初始化,線程不安全
/**
* @author zhaokai008@ke.com
* @date 2019-07-21 00:18
*/
public class Lazy {
private static Lazy instance;
private Lazy (){
}
public static Lazy getInstance() {
if (instance == null) {
instance = new Lazy ();
}
return instance;
}
}
- 懶漢模式(線程安全)
加鎖保證線程安全
/**
* @author zhaokai008@ke.com
* @date 2019-07-21 00:21
*/
public class LazySafe {
private static LazySafe instance;
private LazySafe (){
}
public static synchronized LazySafe getInstance() {
if (instance == null) {
instance = new LazySafe();
}
return instance;
}
}
- (懶漢)雙重檢查模式
/**
* @author zhaokai008@ke.com
* @date 2019-07-21 00:24
*/
public class DCL {
private volatile static DCL instance;
private DCL (){
}
public static DCL getInstance() {
if (instance== null) {
synchronized (DCL.class) {
if (instance== null) {
instance= new DCL();
}
}
}
return instance;
}
}
- (懶漢)靜態(tài)內(nèi)部類單例模式
第一次加載Singleton類時(shí)并不會(huì)初始化sInstance,只有第一次調(diào)用getInstance方法時(shí)虛擬機(jī)加載SingletonHolder 并初始化sInstance
/**
* @author zhaokai008@ke.com
* @date 2019-07-21 00:26
*/
public class Singleton {
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.sInstance;
}
private static class SingletonHolder {
private static final Singleton sInstance = new Singleton();
}
}
- 枚舉
線程安全枯怖,簡(jiǎn)單注整,但是可讀性不強(qiáng),建議加注釋
/**
* @author zhaokai008@ke.com
* @date 2019-07-21 00:28
*/
public enum SingletonEnum {
INSTANCE;
}