Java設計模式之單列模式

2021-08-18 18:07:57 字數 2591 閱讀 1010

單列模式:單一,也就是說乙個類只能有乙個物件。就類似於有些軟體只能開啟一次,當需要保證乙個物件在記憶體中的唯一性時,就需要引入單列模式。

建立單列模式分三步操作:

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物件在記憶體堆...