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

首頁 > 學院 > 開發設計 > 正文

Java模式設計之單例模式(四)

2019-11-18 13:50:38
字體:
來源:轉載
供稿:網友

  不完全的單例類

  什么是不完全的單例類

  估計有些讀者見過下面這樣的“不完全”的單例類。

  代碼清單10:“不完全”單例類

package com.javapatterns.singleton.demos;
public class LazySingleton
{
PRivate static LazySingleton
m_instance = null;
/**
* 公開的構造子,外界可以直接實例化
*/
public LazySingleton() { }
/**
* 靜態工廠方法
* @return 返還LazySingleton 類的惟一實例
*/
synchronized public static
LazySingleton getInstance()
{
if (m_instance == null)
{
m_instance = new LazySingleton();
}
return m_instance;
}
}
  上面的代碼乍看起來是一個“懶漢”式單例類,仔細一看,發現有一個公開的構造子。由于外界可以使用構造子創建出任意多個此類的實例,這違反了單例類只能有一個(或有限個)實例的特性,因此這個類不是完全的單例類。這種情況有時會出現,比如javax.swing.TimerQueue 便是一例,關于這個類,請參見《Java與模式》一書中的“觀察者模式與Swing 定時器” 一章。

  造成這種情況出現的原因有以下幾種可能:

 ?。?) 初學者的錯誤。許多初學者沒有熟悉到單例類的構造子不能是公開的,因此犯下這個錯誤。有些初學Java 語言的學員甚至不知道一個Java 類的構造子可以不是公開的。在 這種情況下,設計師可能會通過自我約束,也就是說不去調用構造子的辦法,將這個不完全的單例類在使用中作為一個單例類使用。

  在這種情況下,一個簡單的矯正辦法,就是將公開的構造子改為私有的構造子。

 ?。?) 當初出于考慮不周,將一個類設計成為單例類,后來發現此類應當有多于一個的實例。為了彌補錯誤, 干脆將構造子改為公開的,以便在需要多于一個的實例時, 可以隨時調用構造子創建新的實例。要糾正這種情況較為困難,必須根據具體情況做出改進的決定。假如一個類在最初被設計成為單例類,但后來發現實際上此類應當有有限多個實例,這時候應當考慮是否將單例類改為多例類(Multiton)。

 ?。?)設計師的Java 知識很好,而且也知道單例模式的正確使用方法,但是還是有意使用這種不完全的單例模式,因為他意在使用一種“改良”的單例模式。這時候, 除去共有的構造子不符合單例模式的要求之外,這個類必須是很好的單例模式。

  默認實例模式

  有些設計師將這種不完全的單例模式叫做“默認實例模式”(Default Instance Pattern)。在所謂的“ 默認實例模式”里面, 一個類提供靜態的方法,如同單例模式一樣, 同時又提供一個公開的構造子,如同普通的類一樣。

  這樣做的惟一好處是,這種模式答應客戶端選擇如何將類實例化:創建新的自己獨有的實例,或者使用共享的實例。這樣一來,由于沒有任何的強制性措施,客戶端的選擇不一定是合理的選擇。其結果是設計師往往不會花費時間在如何提供最好的選擇上,而是不恰當地將這種選擇交給客戶端的程序員,這樣必然會導致不理想的設計和欠考慮的實現。

  本文建議讀者不要這樣做。 相關模式

  有一些模式可以使用單例模式,如抽象工廠模式可以使用單例模式,將具體工廠類設計成單例類;建造模式可以使用單例模式,將具體建造類設計成單例類。

  多例(Multiton)模式

  正如同本章所說的,單例模式的精神可以推廣到多于一個實例的情況。這時候這種類叫做多例類,這種模式叫做多例模式。單例類(左)和多例類(右)的類圖如下所示。

Java模式設計之單例模式(四)(圖一)

  關于多例模式,請見《Java與模式》一書中的“專題:多例(Multiton)模式與多語言支持”一章。

  簡單工廠(Simple Factory)模式

  單例模式使用了簡單工廠模式(又稱為靜態工廠方法模式)來提供自己的實例。在上面ConfigManager 例子的代碼中, 靜態工廠方法getInstance() 就是靜態工廠方法。在java.awt.Toolkit 類中,getDefaultToolkit() 方法就是靜態工廠方法。簡單工廠模式的簡略類圖如下所示。

Java模式設計之單例模式(四)(圖二)

  本章討論了單例模式的結構和實現方法。

  單例模式是一個看上去很簡單的模式,很多設計師最先學會的往往是單例模式。然而,隨著Java 系統日益變得復雜化和分散化,單例模式的使用變得比過去困難。本書提醒讀者在分散式的Java 系統中使用單例模式時,盡量不要使用有狀態的。

  問答題

  1. 為什么不使用一個靜態的“全程”原始變量,而要建一個類?一個靜態的原始變量當然只能有一個值,自然而然不就是“單例”的嗎?

  2. 舉例說明如何調用EagerSingleton 類。

  3. 舉例說明如何調用RegSingleton 類和RegSingletonChild 類。

  4. 請問java.lang.Math 類和java.lang.StrictMath 類是否是單例模式?

  5. 我們公司只購買了一個JDBC 驅動軟件的單用戶使用許可,可否使用單例模式治理通過JDBC 驅動軟件連接的數據庫

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乌恰县| 茂名市| 荥阳市| 湾仔区| 阿尔山市| 垦利县| 连南| 万宁市| 温宿县| 紫金县| 鹤山市| 夏邑县| 苏尼特右旗| 东辽县| 金山区| 贡嘎县| 朝阳市| 霞浦县| 三河市| 文登市| 凉山| 安徽省| 廉江市| 阳朔县| 新竹市| 开鲁县| 瑞金市| 临澧县| 乐至县| 项城市| 淮南市| 靖江市| 卢龙县| 芦山县| 巢湖市| 华宁县| 邯郸市| 霍城县| 体育| 会东县| 织金县|