單例模式是很別緻的乙個模式
,很少有人拿它跟其他模式相比,因為
,單例模式很簡單
,很特別
,作用就是保證乙個類有唯一乙個例項
,並讓乙個全域性變數使得它能被訪問
.而保證這個類只被例項化一次的辦法就是把建構函式變為私有的
,除了它自己都不能
new新物件
,然後把例項化的過程寫在類自身的公有方法裡,是否
new新物件只有它自己判斷決定
,已經有了乙個例項就直接返回已存在的物件
,沒有就
new乙個新例項
.其他類想例項化乙個物件時調這個公有方法.
//餓漢式
class xmlconfigreader
public static xmlconfigreader getinstance()
}
//懶漢式(延遲載入lazy)
class xmlconfigreader
return instance;
}}
我們常常聽到
"double-check locking"即"
雙重鎖定
"的概念
,這是因為還有一種加鎖方式
,即使用
lock
.
class xmlconfigreader
public static xmlconfigreader getinstance()
}} return instance;
}}
對比
: 單例模式分兩類
,這種靜態初始化的方式是在類被載入時例項化
,與懶漢式的第一次被引用時才例項化相比提前占用系統資源
;但懶漢式需要加鎖保證多執行緒訪問的安全性
,餓漢式卻不需要
.我們只好擇其善者而用之…
專案中的單例應用:
drp中幾乎每個模組都有
manager
,在系統開發的初期
,因為只有
clientmanager
,使用單例模式如下
:
public class clientmanager
public static clientmanager getinstance()
}
隨著系統複雜度的增加
,出現越來越多的
manager,如
itemmanager,flowcardmanager等,
而且這時候
manager
與dao
進行了分離
,出現了分層
.系統採用了抽象工廠
+反射技術實現
manager
類和dao
類的例項化
.單例又被應用在工廠中
.
public class beanfactory catch (documentexception e) }
public static beanfactory getinstance()
}
以下這段**是工廠類中得到
manager
的單例實現的一部分
.開始還真以為是享元模式
,後來發現這個實現比享元模式還要靈活
.它能保證物件只有乙個例項
,因此還是單例模式的應用
.越到後面用到的東西越多
,已經不僅僅侷限於某乙個模式或技術了,享元
,單例,工廠
,**……
//儲存service相關物件
private map servicemap=new hashmap();
/** * 根據產品編號取得service系列產品
* @param beanid
* @return
*/public synchronized object getserviceobject(class c)
element beanelt=(element)doc.selectsinglenode("//service[@id=\"" + c.getname() +"\"]");
string classname=beanelt.attributevalue("class");
object service=null;
try catch (exception e)
return service;
}
通過以上分析和應用
,再看單例模式的重點:
實現上,
私有靜態成員變數
/私有構造方法
/公共的靜態方法
;解決了全域性訪問和例項化控制的問題.
單例的意義不在於建立
,而在於訪問
,也就是說
,要訪問或呼叫的物件如果不存在就建立乙個
,這是唯一乙個
,之後不能再建立
;如果存在就返回該物件
,儘管該物件的屬性因為被重新賦值改變過無數次
,物件是唯一的但不是一成不變的.
5 java單例模式
1 什麼是單例模式 構造方法私有化 靜態屬性指向例項 使用公共的靜態方法將屬性返回出去 分為餓漢式和懶漢式 2 餓漢式舉例 public class singleton 2 新建乙個類屬性 類屬性只能有乙個 指向要例項化的物件 private static singleton singleton n...
Java筆記5 單例模式
一 應用楊景 在計算機系統中,執行緒池 快取 日誌物件 對話方塊 印表機 顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個印表機,但只能有乙個printer spooler,以避免兩個列印作業同時輸出到印表機中。每台計算機可以有若干通訊埠,系統應當集...
設計模式 單例應用 java
最近有空閒時間,就想著把曾經用到過的設計模式做乙個回顧,順便也把它分享出來,僅供參考 1 建立單例類 import org.apache.camel.camelcontext import org.apache.camel.impl.defaultcamelcontext created by lk...