單列模式:單一,也就是說乙個類只能有乙個物件。就類似於有些軟體只能開啟一次,當需要保證乙個物件在記憶體中的唯一性時,就需要引入單列模式。
建立單列模式分三步操作:
1.將建構函式私有化
2.在類中建立乙個本類物件
3.提供乙個公有的介面來返回建立的類
我們訪問類裡面的資料時,分兩種情況:
1.通過例項化物件,然後通過物件的引用「.」出方法或屬性。
2.通過類名「.」呼叫類裡面靜態的方法或屬性。
當我們將類的構造方法私有化時,此時我們無法在類外例項化物件,所以只能通過第二種方法在內部建立乙個static修飾的該類物件,然後定義乙個static修飾的公有的方法將建立的類返回出去。static修飾的資料是跟隨整個類的,在類載入的時候跟著類一起建立,由於建構函式私有化了,所以這個類也就建立了一次。
建立乙個singlehungry類
package com.single_mode;
/** * 單列模式:乙個類只能被建立一次,將類的構造方法私有化,提供公有的返回該物件的方法
* * 餓漢式:載入類的時候就建立了建立了乙個single例項
*/public class singlehungry
public int getage()
public void setname(string name)
public void setage(int age)
private singlehungry()//將建構函式私有化
private static singlehungry single=new singlehungry();
public static singlehungry getinstance()//提供公有訪問的介面,將該物件返回出去
}
建立乙個測試類main類
package com.single_mode;
public class main
}
執行結果:
single1和single2是指向的同乙個物件
讓我們畫張圖來了解一下:
當我們singlehungry.載入類時,這個類的靜態屬性在方法區也就隨著載入,首先在堆區new了乙個singlehungry的物件,假設它的位址為0x10,方法區的single儲存了堆區singlehungry物件的位址,即single=0x10。然後在棧區呼叫getinstance()方法,返回single,並用single1來接收,single1也就指向堆區的singlehungry物件,然後set進行賦值。再次呼叫getinstance()方法時,呼叫之前載入好的singlehungry物件,也就是single2=single=0x10。所以再次get時,它的值是相同的。
建立乙個singlelazy類
package com.single_mode;
/** * 懶漢式:
*/public class singlelazy
// public static singlelazy getinstence()
public static singlelazy getinstence()
}return singlelazy;
}public string getname()
public int getage()
public void setname(string name)
public void setage(int age)
}
在我們用懶漢式發生了延時載入,首先方法區裡面singlelazy賦值為null,在呼叫getinstence()方法時先判斷一下,然後建立物件,而餓漢式在載入類的同時single就在堆區new了乙個物件,這也是它們的區別所在。
或許你會問為什需要加上兩個if判斷?
假設有a,b,c三個執行緒,首先a執行緒搶到了cpu的執行權,執行 singlelazy==null 再執行下乙個singlelazy==null 並且鎖上,當a剛第二次判斷時,cpu的執行權可能被c搶到了(cpu高速不斷的切換執行緒,給我們的感覺每個程序非同步執行),c執行緒進行第一層判斷,由於第二層if上鎖了,在a執行緒執行完畢之前 ,c執行緒無法繼續執行的,只能等待了。c在等待的過程中cpu可能又切到了a執行緒,a執行緒接著執行,當a執行緒建立物件後,把鎖開啟 return singlelazy;。b執行緒得到了cpu的執行權,第一輪if判斷結束false 就直接return singlelazy;最後c執行緒的到cpu執行權,由於a執行緒已把鎖開啟,c執行緒繼續剛才的執行,進行第二次判斷false,return singlelazy;最終得到的是a執行緒所建立的乙個物件,解決了執行緒互斥問題。
每日雞湯:耐得住寂寞、經得起**。你會發現通往成功的道路並不擁擠,因為能堅持到最後的沒有幾個!
over !
java設計模式之單列模式(Singleton)
本篇只是簡單介紹單列模式,主要是讓初學者理解單列模式,各種加鎖 多實現 業務場景待以後補充。關鍵字 只產生乙個例項,構造器私有化。構造器私有化 private 是為了禁止singleton類外部呼叫建構函式。如果從singleton類以外的 中呼叫建構函式 new singleton 就會出現編譯錯...
詳談設計模式之單列模式
掌握設計模式的層次 剛開始學程式設計不久,聽說過什麼是設計模式 由很長時間的程式設計經驗,自己寫了很多 其中用到了設計模式,但是自己卻不知道 學習過了設計模式,發現自己已經在使用了,並且發現了一些新的模式挺好用的 閱讀了很多別人寫的原始碼和框架,在其中看到別人設計模式,並且能夠領會設計模式的精妙和帶...
設計模式 單列模式
何為設計模式呢?簡單的說就是能重複利用的解決方案,當碰到a專案也出現這種情況,b專案也出現這種情況 那麼是否能把這懂實現功能抽象出來,形成一種解決方案.單列模式 顧名思義就是乙個例項 即乙個物件只能初始化一次 作用 減少開闢記憶體空間,節約記憶體開銷 class program 因為a物件在記憶體堆...