單例模式Singleton---小白初識
1. 什麼是單例模式?單例模式的應用場景?
名稱:單例模式
英文名:Singleton
定義:java中單例模式是一種常見的設計模式,單例就是“一個物件,只例項化一次。”
分類:主要分為:“懶漢式”單例模式 ||“餓漢式”單例模式
具體分類定義:
(1)懶漢式:
//懶漢式單例類,在本類第一次呼叫的時候例項化自己
publicclassLazyManSingleton {
//私有化構造方法
private LazyManSingleton(){}
//定義空單例物件,不呼叫,則不例項
privatestaticLazyManSingleton
//靜態工廠方法
publicstaticLazyManSingleton getInstance()
{
if(single==null)
{ //當被呼叫時,例項化懶漢物件
single=new LazyManSingleton();}
returnsingle;
}
}
(2)餓漢式:
//餓漢式單例類,在類初始化時,自行例項化
publicclassHungryManSingleton {
//私有化構造方法
private HungryManSingleton (){}
//私有 “例項化後的
privatestaticfinal HungryManSingleton single=new HungryManSingleton();
//靜態工廠方法
publicstatic HungryManSingletongetInstance()
{
//被呼叫時直接返回已經準備好的物件
returnsingle;
}
}
程式碼理解:
首先看看程式碼:無論是lazy還是hungry,他們的單例類都是相同步驟:
第一步:(壟斷)------私有化構造器,這步有何作用呢?總所周知,私有化的東西(變數,方法,構造器)只能被本類(A類)使用,其他類不能直接呼叫,就算是父子類也不行。所以私有化構造器,就確保了其他類不能隨意呼叫A類的構造方法,建立A類的例項物件了,這樣的話,想建立幾個A類物件就要看A類自己的心情了。A類想建立幾個就建立幾個。其他類因為調用不了A類的構造器,所以永遠都不能創建出一個A類物件。當然,天無絕人之路,雖然其他類不能自己生產A類物件了,但是A類可以生產完“賣給”其他類呀,這就要看第二步,第三步了。
第二三步:(生產【盒子】【貨】,發貨)-------A類生產,並傳遞A類物件的環節。這裡也就是“懶漢”和“餓漢”的區別所在了,假設懶漢是A1類,這個A1很懶,做事拖沓,每次都不提前準備一些貨(A1物件),以至於他的物件盒子是空的,只有在別的類來催的時候,才急急忙忙的在靜態工廠裡生產,生產完直接裝箱送貨。所以A1的靜態工廠,是既負責生產,又負責發貨,苦啊,一條龍全包了
。 而“餓漢”A2類,那就不一樣,典型的高效外賣館啊,別人訂貨的瞬間就把盒飯打包好,然後瞬間傳遞到靜態工廠,A2的靜態工廠就只是一個送飯的作用了,不負責做飯。
單例模式的特點:(1)單例類只能有一個例項
(2)單例類必須自己建立自己的唯一例項
(3)單例類必須給所有其他物件提供這一個例項
特點詳解:(1)單例模式為啥只有一個例項,為什麼不多建立幾個例項?
答:單例模式,單例模式,顧名思義,只有一個例項,多好,多麼的節約記憶體,還不容易產生混淆。就一個例項還不好辨認嗎?物件很安全。許多時候,整個系統只需要擁有一個全域性物件,這樣的好處是,我們更容易協調系統整體的行為,這和秦始皇統一度量衡一個道理。專業點的解釋一下就是,比如某個伺服器程式中,該伺服器的配置資訊存放在一個檔案中,這些配置資料由一個單例物件統一讀取(咋讀取啊?),然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊。這種方式簡化了複雜環境下的配置管理。叼!
(2)單例物件必須自己建立自己唯一的物件。
答:讀起來是不是很拗口?其實意思很簡單,自己的物件自己建,別人辦事,我不放心,自己動手,最合心意。單例類,他是幹嘛的?為了啥,才被我們創建出來的?他的目的就是執行統一大業的,統一度量衡,統一文字,統一車軌的,所以他就是標準,他只能是唯一。如果楚國說:“秦國,你的度量衡要按咱楚國的推廣”,齊國說:“秦國,你的文字要按俺的來”,燕國說:“那車軌就按俺們那嘎達燕淫的”。你是秦國,你咋辦?秦國:“一群羊雜碎,統統按額們秦國滴標準來。”所以標準還得自己來造,交給別人一人一個樣。
(3)單例類必須給所有其他物件提供這一個例項
答:綜合上面那兩個特點,最後一個就不用詳解了。你秦國統一文字,度量,車軌,法律幹嘛呢,玩兒呢?肯定是推廣出去啊,讓別人也體驗一下商鞅變法的封建主義的優越性啊。