午夜精品久久久久久-午夜精品久久久久久91-午夜精品久久久久久久-午夜精品久久久久久久2023-国产精品亚洲精品久久成人-国产精品亚洲精品日韩动图

在Java中應用設計模式Singleton

作者:
分類: 觀點/經驗
2010-05-06
2331
基本概念

  Singleton 是一種創建性模型,它用來確保只產生一個實例,并提供一個訪問它的全局訪問點.對一些類來說,保證只有一個實例是很重要的,比如有的時候,數據庫連接或 Socket 連接要受到一定的限制,必須保持同一時間只能有一個連接的存在.再舉個例子,集合中的 set 中不能包含重復的元素,添加到set里的對象必須是唯一的,如果重復的值添加到 set,它只接受一個實例.JDK中正式運用了Singleton模式來實現 set 的這一特性,大家可以查看java.util.Collections里的內部靜態類SingletonSet的原代碼.其實Singleton是最簡單但也是應用最廣泛的模式之一,在 JDK 中隨處可見.

  簡單分析

  為了實現 Singleton 模式,我們需要的是一個靜態的變量,能夠在不創建對象的情況下記憶是否已經產生過實例了.靜態變量或靜態方法都可以在不產生具體實例的情況下直接調用,這樣的變量或方法不會因為類的實例化而有所改變.在圖1的結構中可以看到,uniqueInstance 就是這個獨立的靜態變量,它可以記憶對象是否已經實例化了,在靜態方法 Instance 中對這個變量進行判斷,若沒有實例化過就產生一個新的對象,如果已經實例化了則不再產生新的對象,仍然返回以前產生的實例.

  圖1: Singleton 模式結構

具體實施

  實現 Singleton 模式的辦法通常有三種.

  一. 用靜態方法實現 Singleton 這種方法是使用靜態方法來監視實例的創建.為了防止創建一個以上的實例,我們最好把構造器聲明為 private.

  這樣可以防止客戶程序員通過除由我們提供的方法之外的任意方式來創建一個實例,如果不把構造器聲明為private,編譯器就會自作聰明的自動同步一個默認的friendly構造器.這種實現方法是最常見的,也就是圖1中結構的標準實現.

singletonTest運行結果是:

  Creating one instance

  Creating two instance

  Only one instance allowed

  可以看出,第一個實例順利創建,第二個實例創建實拋出了我們自定義的異常.

  三. 用注冊器機制來創建 Singleton 首先用集合中的Hashtable 和Enumeration來實現addItem(Object key, Object value),getItem(Object key), ,removeItem(Object key)等方法實現一個管理器,將key和value一一關聯起來,客戶程序員創建實例前首先用addItem方法進行注冊,再用getItem方法獲取實例.Hashtable中的key是唯一的,從而保證創建的實例是唯一的,具體實現限于篇幅不再細說,在Prototype模型的應用一文中我將會給出一個實現注冊器的代碼.用注冊器機制來創建 Singleton模式的好處是易于管理,可以同時控制多個不同類型的Singleton 實例.

  小結

  Singleton模式可以方便的進行擴充,產生指定數目的實例.

  在The Design Patterns Java Companion 一書中曾提到過用靜態類的方式來實現 Singleton模式,并指出java.lang.Math就是一個例子,這里我并不表示贊同,因為Math并不是一個真正的對象,我們只是直接調用Math類所包裝的靜態方法而已,根本就沒有創建實例的過程,又從何說起只產生一個實例呢?這個問題我曾到Javaranch的論壇上發過帖子,所有回帖的人也都是對這一觀點持否定態度. 

  在多線程的程序中,singleton可能會變的不可靠,可能會出現多個實例,解決的辦法很簡單,加個同步修飾符: public static synchronized Singleton getInstance(). 這樣就保證了線程的安全性. 

  最后要說的是大家可能會看見一些其他實現Singleton模式的方法,因為模式在具體的應用時是靈活的,不是一成不變的,并沒有一個固定的做法,但大都是上面幾種方法的變形. 

0
0
分享到:

0

喜歡他,就推薦他上首頁吧^_^

推薦閱讀

×

賽事服務聯系方式

0371-86068866

4008887269

cndesign@163.com

好的,我知道了

官方微信

聯系我們

  • QQ:33143335 QQ:1904200230
  • 電話:18569912460
  • 投稿:cndesign@163.com
  • 地址:鄭州市國家大學科技園東區9號樓2層

版權信息

  移動 Android 版 豫 ICP 備16038122號-2 豫公網安備 41019702002261號

主站蜘蛛池模板: 一区二区三区四区在线不卡高清 | 欧美性受一区二区三区 | 干成人| 深夜偷偷看视频在线观看 | 欧美一级鲁丝片 | 性欧美精品 | 日韩毛片免费 | 免费观看黄视频 | 国产精品理论 | 亚洲婷婷在线视频 | 亚洲国产一区二区三区在线观看 | 狠狠操综合 | 啪啪网站免费看 | 日韩成人一级 | 亚洲区在线播放 | 成人国内精品久久久久影院 | 台湾av | 天天视频在线观看免费 | 日本三级全黄 | 久久精品亚洲一级毛片 | 色网综合 | 狠狠色噜噜噜噜狠狠狠狠狠狠奇米 | 看a网站 | 91激情| 免费看男女做好爽好硬视频 | 天天插天天搞 | aaa一级片 | 国产高清在线精品一区 | 天天在线影院 | 青青草99热久久 | 欧美成人午夜视频 | 欧美黑人巨大日本人又爽又色 | 日鲁夜鲁鲁狠狠综合视频 | 亚洲欧美日韩一区 | 2018天堂视频免费观看 | www.五月激情| 日本三级欧美三级香港黄 | 天天躁夜夜躁狠狠躁2024 | 藏经阁在线观看 | 国产亚洲自在精品久久 | 又粗又大又爽又色又过瘾视频 |