国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java模式設(shè)計(jì)之單例模式(一)

2019-11-18 15:39:28
字體:
供稿:網(wǎng)友

  作為對(duì)象的創(chuàng)建模式[GOF95], 單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。這個(gè)類稱為單例類。

  注:本文乃閻宏博士的《java與模式》一書的第十五章。

  引言

  單例模式的要點(diǎn)

  單例單例

  顯然單例模式的要點(diǎn)有三個(gè);一是某各類只能有一個(gè)實(shí)例;二是它必須自行創(chuàng)建這個(gè)事例;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。在下面的對(duì)象圖中,有一個(gè)"單例對(duì)象",而"客戶甲"、"客戶乙" 和"客戶丙"是單例對(duì)象的三個(gè)客戶對(duì)象。可以看到,所有的客戶對(duì)象共享一個(gè)單例對(duì)象。而且從單例對(duì)象到自身的連接線可以看出,單例對(duì)象持有對(duì)自己的引用。

Java模式設(shè)計(jì)之單例模式(一)(圖一)


  資源治理

  一些資源治理器經(jīng)常設(shè)計(jì)成單例模式。

  在計(jì)算機(jī)系統(tǒng)中,需要治理的資源包括軟件外部資源,譬如每臺(tái)計(jì)算機(jī)可以有若干個(gè)打印機(jī),但只能有一個(gè)PRinter Spooler, 以避免兩個(gè)打印作業(yè)同時(shí)輸出到打印機(jī)中。每臺(tái)計(jì)算機(jī)可以有若干傳真卡,但是只應(yīng)該有一個(gè)軟件負(fù)責(zé)治理傳真卡,以避免出現(xiàn)兩份傳真作業(yè)同時(shí)傳到傳真卡中的情況。每臺(tái)計(jì)算機(jī)可以有若干通信端口,系統(tǒng)應(yīng)當(dāng)集中治理這些通信端口,以避免一個(gè)通信端口同時(shí)被兩個(gè)請(qǐng)求同時(shí)調(diào)用。

  需要治理的資源包括軟件內(nèi)部資源,譬如,大多數(shù)的軟件都有一個(gè)(甚至多個(gè))屬性(properties)文件存放系統(tǒng)配置。這樣的系統(tǒng)應(yīng)當(dāng)由一個(gè)對(duì)象來治理一個(gè)屬性文件。

  需要治理的軟件內(nèi)部資源也包括譬如負(fù)責(zé)記錄網(wǎng)站來訪人數(shù)的部件,記錄軟件系統(tǒng)內(nèi)部事件、出錯(cuò)信息的部件,或是對(duì)系統(tǒng)的表現(xiàn)進(jìn)行檢查的部件等。這些部件都必須集中治理,不可政出多頭。

  這些資源治理器構(gòu)件必須只有一個(gè)實(shí)例,這是其一;它們必須自行初始化,這是其二;答應(yīng)整個(gè)系統(tǒng)訪問自己這是其三。因此,它們都滿足單例模式的條件,是單例模式的應(yīng)用。

  一個(gè)例子:Windows 回收站

  Windows 9x 以后的視窗系統(tǒng)中都有一個(gè)回收站,下圖就顯示了windows 2000 的回收站。

Java模式設(shè)計(jì)之單例模式(一)(圖二)

  在整個(gè)視窗系統(tǒng)中,回收站只能有一個(gè)實(shí)例,整個(gè)系統(tǒng)都使用這個(gè)惟一的實(shí)例,而且回收站自行提供自己的實(shí)例。因此,回收站是單例模式的應(yīng)用。

  雙重檢查成例

  在本章最后的附錄里研究了雙重檢查成例。雙重檢查成例與單例模式并無直接的關(guān)系,但是由于很多C 語言設(shè)計(jì)師在單例模式里面使用雙重檢查成例,所以這一做法也被很多Java 設(shè)計(jì)師所模擬。因此,本書在附錄里提醒讀者,雙重檢查成例在Java 語言里并不能成立,詳情請(qǐng)見本章的附錄。 單例模式的結(jié)構(gòu)

  單例模式有以下的特點(diǎn):

   .. 單例類只可有一個(gè)實(shí)例。

   .. 單例類必須自己創(chuàng)建自己這惟一的實(shí)例。

   .. 單例類必須給所有其他對(duì)象提供這一實(shí)例。

  雖然單例模式中的單例類被限定只能有一個(gè)實(shí)例,但是單例模式和單例類可以很輕易被推廣到任意且有限多個(gè)實(shí)例的情況,這時(shí)候稱它為多例模式(Multiton Pattern) 和多例類(Multiton Class),請(qǐng)見"專題:多例(Multiton )模式與多語言支持"一章。單例類的簡(jiǎn)略類圖如下所示。

Java模式設(shè)計(jì)之單例模式(一)(圖三)


  由于Java 語言的特點(diǎn),使得單例模式在Java 語言的實(shí)現(xiàn)上有自己的特點(diǎn)。這些特點(diǎn)主要表現(xiàn)在單例類如何將自己實(shí)例化上。

  餓漢式單例類餓漢式單例類是在Java 語言里實(shí)現(xiàn)得最為簡(jiǎn)便的單例類,下面所示的類圖描述了一個(gè)餓漢式單例類的典型實(shí)現(xiàn)。

Java模式設(shè)計(jì)之單例模式(一)(圖四)

  從圖中可以看出,此類已經(jīng)自已將自己實(shí)例化。

  代碼清單1:餓漢式單例類

public class EagerSingleton
{
private static final EagerSingleton m_instance =
new EagerSingleton();
/**
* 私有的默認(rèn)構(gòu)造子
*/
private EagerSingleton() { }
/**
* 靜態(tài)工廠方法
*/
public static EagerSingleton getInstance()
{

·224·Java 與模式
return m_instance;
}
}
  讀者可以看出,在這個(gè)類被加載時(shí),靜態(tài)變量m_instance 會(huì)被初始化,此時(shí)類的私有構(gòu)造子會(huì)被調(diào)用。這時(shí)候,單例類的惟一實(shí)例就被創(chuàng)建出來了。

  Java 語言中單例類的一個(gè)最重要的特點(diǎn)是類的構(gòu)造子是私有的,從而避免外界利用構(gòu)造子直接創(chuàng)建出任意多的實(shí)例。值得指出的是,由于構(gòu)造子是私有的,因此,此類不能被繼續(xù)。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 根河市| 舞阳县| 左权县| 巴林左旗| 博爱县| 娄烦县| 珠海市| 阳江市| 香格里拉县| 灯塔市| 晋州市| 上饶市| 绵竹市| 玉屏| 新民市| 镇江市| 行唐县| 云安县| 万安县| 呼玛县| 皮山县| 蕲春县| 郯城县| 建阳市| 五峰| 荔浦县| 鹤壁市| 丰都县| 伊吾县| 武清区| 杨浦区| 肇东市| 上思县| 松原市| 临夏县| 安乡县| 新乐市| 长治县| 集贤县| 深圳市| 湘阴县|