單例模式,可以說是設計模式種最簡單的模式了,因為它只有乙個物件,這也就呼應了它的名字「單例模式」,至於為什麼只有乙個物件,下面會進一步講述。
這裡先說說單例模式的使用場景吧,在此我總結了以下幾種:
1.資料共享。例如:執行緒池,需要管理執行緒的數量
2.提高效率,降低記憶體損耗。例如:db連線池,連線的是同一種資料資源,所以頻繁的開啟關閉會造成效率損耗,而且會大量的產生物件,造成不必要的記憶體消耗
3.考慮執行緒安全。
下面給出乙個例子來說明一下單例模式:這個例子很簡單,也很貼近生活,那就是平時家裡使用的自動蓄水器,每當水蓄滿的時候就會停止蓄水:
上面的例子如果不使用單例模式來實現,就會發生當使用者多次按下蓄水操作按鈕的時候,會導致例項化多個蓄水操作的物件,由於物件的成員變數屬於物件私有的(靜態的例外),所以不可以進行資料共享,也非執行緒安全,最終導致蓄水器在水蓄滿了以後還會繼續進行蓄水導致溢位。這是由於多的物件對同一事件進行操作的結果。
然而單例模式,不管使用者多次按下蓄水操作按鈕,始終都是只有乙個蓄水操作的物件,這樣可以有效的進行資料共享,而且是執行緒安全,當水蓄滿了以後,就會終止給水操作,有效的防止了溢位。
下面給出單例模式的實現方式:
第一種,最簡單的就是人們說的「餓漢式」
public
class
singletop
//這裡就回答了上面為什麼,單例模式只有乙個物件的問題了
//構造方法是有化,外面不可以呼叫構造方法
private
singletop()
}
這個方式它的優點就是確保了當前類只有乙個物件,缺點是當大量存在這種模式的時候,有可能造成不必要的資源開銷。
下面就進行改良延遲例項化,其中
public
class singletop
private
singletop()
}
這種方式在需要用到的時候才進行實力,可以解決了不必要的開銷,但是在多執行緒上就難以確保,物件的唯一性了,當第乙個執行緒還沒例項化完成,第二個執行緒就進行 st == null,這種情況下就會有多個物件存在了
,所以這種情況比較適合用於單執行緒;
好了下面繼續對他進行修改:
public
class
singletop
private
singletop()
}
這種方式解決了,執行緒安全區別同時只有個執行緒呼叫,但是這種方式在高併發的程式中是相當糟糕的。
下面繼續修改:
public
class
singletop
}return st;
}private
singletop()
}
通過雙重檢索的方式,既可以減低不必要的開銷,又符號執行緒安全,還解決了併發的問題。這就比較完美的實現方法了 設計模式複習 單例模式
設計模式 單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問節點。懶漢模式涉及多執行緒上鎖問題,餓漢模式不涉及多執行緒上鎖問題 下面實現懶漢跟餓漢模式,先不考慮上鎖問題,最後補充。設計模式 迭代器模式 iterator 提供一種方法順序訪問乙個聚合物件中的各個元素,而...
設計模式複習之單例模式
單例模式 保證同乙個類只有乙個物件例項 主要複習三種實現方式 餓漢 飽漢 雙重校驗鎖 1.餓漢 模式 單例模式之餓漢模式 類載入時即建立例項物件 public class singletona public static singletona getinstance 2.飽漢模式 單例模式之飽漢模式...
設計模式之單例模式複習總結
單例模式 單例模式就是該類在整個程式的使用過程中有且僅有乙個例項。也就是它的構造方法是私有的,該類負責建立自己的物件,同時確保只有乙個物件被建立。當有些封裝的類會去重複載入,使用單例模式可以節省資源。單例模式有哪些?還有列舉,列舉的可讀性差就先不看了 懶漢模式 懶漢模式就是用到就通過呼叫getsta...