小胖這幾天由於把時間花在了公司的任務上,所以就沒有寫關於設計模式的文章,現在系統的流程熟悉了很多,不需要把大部分的時間花在任務上,也有一些時間來學習設計模式了,今天把之前學習的單例模式補上!
定義:
「看來每個設計模式之間有那麼一絲關係啊!」,小胖自言自語道,邊看邊唱到「你和他還在藕斷絲連。。。」,對於系統中的某些類來說,只有乙個
例項很重要,例如,乙個系統中可以存在多個列印任務,但是只能有乙個正在工作的任務;乙個系統只能有乙個視窗管理器或檔案系統;乙個系統只能有乙個計時工具或id(序號)生成器。如在windows中就只能開啟乙個任務管理器。如果不使用機制對視窗物件進行唯一化,將彈出多個視窗,如果這些視窗顯示的內容完全一致,則是重複物件,浪費記憶體資源;如果這些視窗顯示的內容不一致,則意味著在某一瞬間系統有多個狀態,與實際不符,也會給使用者帶來誤解,不知道哪乙個才是真實的狀態。因此有時確保系統中某個物件的唯一性即乙個類只能有乙個例項非常重要。
」原來是這樣「,小胖繼續看下去
單例模式要點有三個:
某個類只能有乙個例項
它必須自行建立這個例項
它必須自行的向整個系統提供這個例項
從具體實現的角度來看:
只提供私有的建構函式
類定義中含有乙個該類的靜態私有物件
該類提供乙個靜態的共有函式用於建立或獲取它本身的靜態私有物件
小胖看了看一些博主寫的單例模式見解,總結出了一些
單例模式分為最常見的三種:餓漢模式、懶漢模式、雙重鎖模式,小胖對餓漢與懶漢比較感興趣,急忙的將這兩個**實現出來,**如下:
餓漢模式
/**
* 餓漢
* @author administrator
* */
public class singleton
public static singleton getinstance()
public void print()
public string getstr()
public void setstr(string str)
}
懶漢模式:
/**
* 懶漢模式
* @author administrator
*/public class lazysingleton
return instance;
} public void print()
public string getstr()
public void setstr(string str)
private lazysingleton()
}
小胖仔細的分析了這兩段**,
餓漢模式在測試**還沒有呼叫該類的時候,已經new出例項了,」真是飢餓難耐啊!「
懶漢模式沒有new例項,只是當測試**在呼叫該類的時候,首先對instance進行了乙個判斷,如果存在直接返回,如果不存在,此時,才new乙個例項返回,」呵呵,也夠懶的,但是比餓漢好一點「
餓漢和懶漢搞懂了,這個雙重鎖是怎麼回事呢?
這裡引入了執行緒的問題,以上對單執行緒是沒有錯的,假如是多個執行緒同時使用懶漢模式下的單例呢?現有a,b兩個執行緒,同時去呼叫這個單例類,同時判斷instance,當然為空了,於是a和b就同時得到了例項
,針對這個問題,雙重鎖就出現了,也就是對instance進行兩次判斷,**如下:
/**
* 雙重鎖模式
* @author administrator
* */
public class singletonobject
public static singletonobject getinstance()
}} return obj;
}
這次對instance進行了兩次判斷,再多的程序也不怕了!
單例模式的類圖如下:
設計模式之單例模式
前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...
設計模式之單例模式
package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...
設計模式之 單例模式
單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...