在Java中應(yīng)用設(shè)計模式Singleton

      作者:
      2010-05-06
      2342
      基本概念

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

        簡單分析

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

        圖1: Singleton 模式結(jié)構(gòu)

      具體實施

        實現(xiàn) Singleton 模式的辦法通常有三種.

        一. 用靜態(tài)方法實現(xiàn) Singleton 這種方法是使用靜態(tài)方法來監(jiān)視實例的創(chuàng)建.為了防止創(chuàng)建一個以上的實例,我們最好把構(gòu)造器聲明為 private.

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

      singletonTest運行結(jié)果是:

        Creating one instance

        Creating two instance

        Only one instance allowed

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

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

        小結(jié)

        Singleton模式可以方便的進行擴充,產(chǎn)生指定數(shù)目的實例.

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

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

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

      0
      0
      分享到:

      0

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

      推薦閱讀

      ×

      賽事服務(wù)聯(lián)系方式

      0371-86068866

      4008887269

      cndesign@163.com

      好的,我知道了

      官方微信

      聯(lián)系我們

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

      版權(quán)信息

        移動 Android 版 豫 ICP 備16038122號-2 豫公網(wǎng)安備 41019702002261號

      主站蜘蛛池模板: 国模大尺度视频一区二区| 无码少妇一区二区浪潮免费| 国产精品一区在线麻豆| 冲田杏梨高清无一区二区| 99久久精品午夜一区二区| 日本一区二区三区精品中文字幕| 视频一区二区在线播放| 国产99视频精品一区| 亚洲AV综合色一区二区三区| 国产在线精品一区二区三区不卡 | 亚洲国产一区视频| 日韩视频在线一区| 精品日韩一区二区| 国产精品av一区二区三区不卡蜜| 中文字幕亚洲综合精品一区| 亚洲国产精品一区第二页| 亚洲一区二区三区国产精品| 日韩精品一区二三区中文| 高清一区高清二区视频| 免费萌白酱国产一区二区| 精品一区二区三区在线播放| 国产成人免费一区二区三区| 精品一区精品二区| 一区二区三区在线|日本| 亚洲视频在线一区二区| 国产福利一区二区在线视频 | 色窝窝无码一区二区三区| 亚洲国产成人一区二区三区| 91在线一区二区三区| 国产美女在线一区二区三区| 国产香蕉一区二区三区在线视频 | 日韩亚洲一区二区三区| 国产一区二区中文字幕| 中文字幕乱码一区二区免费| 久久一区二区三区免费播放| 亚洲欧洲精品一区二区三区| 精品国产一区二区三区AV | 亚洲AV无码一区东京热| 无码免费一区二区三区免费播放| 美女毛片一区二区三区四区| 国精产品一区一区三区有限在线|