Java專案 5 單例模式的應用與研究

2021-06-26 16:05:10 字數 2589 閱讀 4781

單例模式是很別緻的乙個模式

,很少有人拿它跟其他模式相比,因為

,單例模式很簡單

,很特別

,作用就是保證乙個類有唯一乙個例項

,並讓乙個全域性變數使得它能被訪問

.而保證這個類只被例項化一次的辦法就是把建構函式變為私有的

,除了它自己都不能

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...