簡(jiǎn)單講解在Java編程中實(shí)現(xiàn)設(shè)計(jì)模式中的單例模式結(jié)構(gòu)
1. 模式介紹
模式的定義
確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。
模式的使用場(chǎng)景
確保某個(gè)類有且只有一個(gè)對(duì)象的場(chǎng)景,例如創(chuàng)建一個(gè)對(duì)象需要消耗的資源過多,如要訪問 IO 和數(shù)據(jù)庫(kù)等資源。
2. UML類圖

角色介紹:
(1)Client : 高層客戶端。
(2)Singleton : 單例類。
3. 模式的簡(jiǎn)單實(shí)現(xiàn)
public class Singleton {
private static Singleton intance;
private Singleton() {}
public static Singleton getInstance() {
/*
* 一開始多線程進(jìn)來,遇到鎖,一個(gè)線程進(jìn)去,是為空,new對(duì)象; 后續(xù)線程進(jìn)入,不為空,不操作;最后直接返回
* 對(duì)象不為空,再有多個(gè)線程進(jìn)入該函數(shù),不為空,不執(zhí)行加鎖操作,直接返回
*/
if (intance == null) {
synchronized (Singleton.class) {
if (intance == null) {
intance = new Singleton();
}
}
}
return intance;
}
}
class Singleton1 {// 懶漢式
private static Singleton1 intance = new Singleton1();//懶的,程序運(yùn)行的時(shí)候就加載出來了
private Singleton1() {}
public static Singleton1 getInstance() {
return intance;
}
}
class Singleton2 {// 餓漢式
private static Singleton2 intance;
private Singleton2() {}
public static Singleton2 getInstance() {//用到的時(shí)候 才加載
if (intance == null) {
intance = new Singleton2();
}
return intance;
}
}
class Singleton3 {// 餓漢式 線程安全
private static Singleton3 intance;
private Singleton3() {}
public synchronized static Singleton3 getInstance() {//用到的時(shí)候 才加載, 加鎖 多線程調(diào)用,都有一個(gè)加鎖的動(dòng)作
if (intance == null) {
intance = new Singleton3();
}
return intance;
}
}
class Singleton4 {// 餓漢式 線程安全
private static Singleton4 intance;
private Singleton4() {}
public static Singleton4 getInstance() {//用到的時(shí)候 才加載
synchronized (Singleton4.class) {// 加鎖 效率跟3差不多
if (intance == null) {
intance = new Singleton4();
}
}
return intance;
}
}
4.優(yōu)點(diǎn)與缺點(diǎn)
(1)優(yōu)點(diǎn):
A.由于單例模式在內(nèi)存中只有一個(gè)實(shí)例,減少了內(nèi)存開支,特別是一個(gè)對(duì)象需要頻繁地創(chuàng)建、銷毀時(shí),而且創(chuàng)建或銷毀時(shí)性能又無法優(yōu)化,單例模式的優(yōu)勢(shì)就非常明顯。
B.由于單例模式只生成一個(gè)實(shí)例,所以減少了系統(tǒng)的性能開銷,當(dāng)一個(gè)對(duì)象的產(chǎn)生需要比較多的資源時(shí),如讀取配置、產(chǎn)生其他依賴對(duì)象時(shí),則可以通過在應(yīng)用啟動(dòng)時(shí)直接產(chǎn)生一個(gè)單例對(duì)象,然后用永久駐留內(nèi)存的方式來解決;
C.單例模式可以避免對(duì)資源的多重占用,例如一個(gè)寫文件動(dòng)作,由于只有一個(gè)實(shí)例存在內(nèi)存中,避免對(duì)同一個(gè)資源文件的同時(shí)寫操作。
D.單例模式可以在系統(tǒng)設(shè)置全局的訪問點(diǎn),優(yōu)化和共享資源訪問,例如可以設(shè)計(jì)一個(gè)單例類,負(fù)責(zé)所有數(shù)據(jù)表的映射處理。
(2)缺點(diǎn)
A.單例模式一般沒有接口,擴(kuò)展很困難,若要擴(kuò)展,除了修改代碼基本上沒有第二種途徑可以實(shí)現(xiàn)。
相關(guān)文章
SpringCloud Feign遠(yuǎn)程調(diào)用實(shí)現(xiàn)詳解
Feign是Netflix公司開發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開發(fā)非?;A(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似2022-11-11
Spring Boot 集成Mybatis實(shí)現(xiàn)主從(多數(shù)據(jù)源)分離方案示例
本篇文章主要介紹了Spring Boot 集成Mybatis實(shí)現(xiàn)主從(多數(shù)據(jù)源)分離方案實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-03-03
項(xiàng)目管理利器-Maven(Windows安裝)圖文教程
下面小編就為大家?guī)硪黄?xiàng)目管理利器-Maven(Windows安裝)圖文教程。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
SpringBoot注冊(cè)第三方Bean的方法總結(jié)
眾所周知,SpringBoot默認(rèn)會(huì)掃描啟動(dòng)類所在的包及其子包,一般我們都是在需要的類上通過注解的方式去將Bean注冊(cè)交給IOC進(jìn)行管理,但是注冊(cè)第三方Bean的方案卻不支持,所以本文給大家介紹了SpringBoot注冊(cè)第三方Bean的方法,需要的朋友可以參考下2024-01-01
Java實(shí)現(xiàn)十秒向MySQL插入百萬條數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)十秒向MySQL插入百萬條數(shù)據(jù),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定借鑒價(jià)值,需要的可以參考一下2022-11-11
舉例講解Java中synchronized關(guān)鍵字的用法
這篇文章主要介紹了Java中synchronized關(guān)鍵字的用法,針對(duì)synchronized修飾方法的使用作出了簡(jiǎn)單講解和演示,需要的朋友可以參考下2016-04-04

