麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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)。

  (3)設計師的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 驅動軟件連接的數據庫?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久不射电影 | 亚洲欧美在线视频免费 | 一级片久久免费 | 91精品国产综合久久久欧美 | 午夜在线成人 | 久久亚洲网 | 中文字幕一二三区芒果 | 性 毛片 | 国产一区二区三区四区波多野结衣 | 免费毛片观看 | 97中文 | 激情小说激情图片激情电影 | 日韩黄站 | 狠狠干夜夜草 | 日本在线播放一区二区 | 黄色片免费在线 | 久久华人| 99精品视频在线免费观看 | tube7xxx| 免费a视频在线观看 | 羞羞的视频免费在线观看 | 99ri在线| 黄网站进入| 日本精品久久久一区二区三区 | 怦然心动50免费完整版 | 久久精品欧美电影 | 精品国产91久久久久久久 | 88xx成人永久免费观看 | 久久精品99久久久久久2456 | 最近中文字幕一区二区 | 一级黄色免费观看 | 性少妇chinesevideo| 黄色片视频观看 | 黄色影院在线观看视频 | 日韩伦理电影免费观看 | 久久超| 日本在线免费观看视频 | 国产99久久精品一区二区300 | 99国产精品国产免费观看 | 午夜精品福利视频 | 中文字幕在线观看精品 |