<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    細心!用心!耐心!

    吾非文人,乃市井一俗人也,讀百卷書,跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點粗墨,七八筆買賣,九十道人情。

    BlogJava 聯(lián)系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks
    Singleton的英文意義是獨身,也就是只有一個人,應(yīng)用在物件導(dǎo)向語言上,通常翻譯作單例:單一個實例(Instance)。

    很多時候,您會需要Singleton模式,例如印表機管理,您希望程式中只能有一個Print Spooler,以避免兩個列印動作同時輸入至印表機中;例如資料庫管理,因為建立連接(Connection)物件會耗用資源,您希望程式中只能有一個連接物件,所有其它的程式都透過這個物件來連接資料庫,以避免連接物件的重複開啟造成資源的耗用;例如系統(tǒng)程式屬性檔的讀取,您使用單一個物件來讀取屬性內(nèi)容,而程式的其它部份都向這個物件要求屬性資料,而不是自行讀取屬性資料。

    以印表機設(shè)計為例,有的設(shè)計人員會採取全域變數(shù)的方式來建立實例,並在程式中隨機取用這個實例,Java雖然不支援全域變數(shù),但透過將物件包裝在一個類別之中,也有人會採用這樣的寫法:
     public class PrintSpooler {
        public PrintSpooler() {
            // ....
        }

        public Connection getSpooler(){
           ....
        }
    }

     public class GlobalObject {
        private PrintSpooler printSpooler;
        public GlobalObject () {
            printSpooler = new PrintSpooler();
            ...
        }
       
        public void getPrintSpooler() {
            return printSpooler;
        }
     }

    無論全域變數(shù)或是以上的例子,都無法保證只產(chǎn)生唯一個實例,您也許會注意不犯這個錯誤,但與您共同工作的夥伴也許會直覺的使用建構(gòu)方法來產(chǎn)生一個 PrintSpooler實例。

    Singleton模式可以保證一個類別只有一個實例,並提供一個訪問(visit)這個實例的方法。

    一個Singleton實作即為Java中的java.lang.Runtime類別,每個Java程式執(zhí)行時都有一個唯一的Runtime物件,可以透過它提供的靜態(tài)方法getRuntime()方法來取得這個物件,例如:
    Runtime runtime = Runtime.getRuntime();

    取得Runtime物件之後,您可以透過它進行一些外部命令的執(zhí)行、進行垃圾處理等等指令,您可以開啟Runtime.java類別,開頭的幾行是這樣寫的:
    public class Runtime {
        private static Runtime currentRuntime = new Runtime();

        public static Runtime getRuntime() {
            return currentRuntime;
        }

       /** Don't let anyone else instantiate this class */
       private Runtime() {}

        // 以下略
    }
     
    上面結(jié)構(gòu)即採用Singleton模式設(shè)計,其結(jié)構(gòu)使用 UML 來表即如下所示:
    Singleton
    如上所示的,Java使用 靜態(tài)工廠 來取得Runtime物件,其中Runtime的建構(gòu)函式被宣告為private,這樣可以阻止其他人使用建構(gòu)方法來建立實例;使用更一般化的表示單例的UML結(jié)構(gòu),如下圖所示:
    Singleton

    有幾個實作上面結(jié)構(gòu)的方法,可以在第一次需要實例時再建立物件,也就是採用所謂的Lazy Initialization:
    public class Singleton {
        private static Singleton instance = null;

        private Singleton() {
            // ....
        }

        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }

            return instance;
        }

        // .. 其它實作
    }

    上面的實作適用於單執(zhí)行緒的程式,在多執(zhí)行緒的程式下,以下的寫法在多個執(zhí)行緒的競爭資源下,將仍有可能產(chǎn)生兩個以上的實例,例如下面的情況:
    Thread1: if(instance == null) // true
    Thread2: if(instance == null) // true

    Thread1: instance = new Singleton(); // 產(chǎn)生一個實例
    Thread2: instance = new Singleton(); // 又產(chǎn)生一個實例

    Thread1: return instance; // 回傳一個實例
    Thread2: return instance; // 又回傳一個實例

    在多執(zhí)行緒的環(huán)境下,為了避免資源同時競爭而導(dǎo)致如上產(chǎn)生多個實例的情況,加上同步(synchronized)機制:
    public class Singleton {
        private static Singleton instance = null;
        private Singleton(){}
        synchronized static public Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
     
    不過這種簡單的寫法不適合用於像伺服器這種服務(wù)很多執(zhí)行緒的程式上,同步機制會造成相當(dāng)?shù)男艿吐洌瑸榱祟櫦癝ingleton、Lazy Initialization與效能問題,因而有了Double-check Locking的模式:
    public class Singleton {
        private static Singleton instance = null;
        private Singleton(){}
        public static Singleton getInstance() {
            if (instance == null){
                synchronized(Singleton.class){
                    if(instance == null) {
                         instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
     
    Java中Runtime類別的作法就簡單多了,它捨棄了Lazy Initialization,如果您的實例初始化不是很久的話,可以用這種方式:
    public class Singleton {
        private static Singleton instance = new Singleton();

        private Singleton() {
            // ....
        }

        public static Singleton getInstance() {
            return instance;
        }

        // 其它實作
    }
     
    Singleton本身的觀念簡單但應(yīng)用很廣,因而很多時候必須對實際環(huán)境作一些考量與調(diào)整,建議您也看看有關(guān)於Singleton的這篇 討論
    posted on 2007-04-17 10:33 張金鵬 閱讀(236) 評論(0)  編輯  收藏 所屬分類: Creational 模式
    主站蜘蛛池模板: 曰批全过程免费视频免费看 | 三年片在线观看免费观看大全动漫| 国产免费av片在线无码免费看| 亚洲伦理中文字幕| 免费能直接在线观看黄的视频 | 成人无码区免费视频观看| 亚洲精品在线播放| **毛片免费观看久久精品| 亚洲毛片无码专区亚洲乱| h视频在线观看免费完整版| 亚洲午夜精品在线| 拨牐拨牐x8免费| 国产精品亚洲专区无码唯爱网| 国产区卡一卡二卡三乱码免费| 立即播放免费毛片一级| 亚洲午夜爱爱香蕉片| 你懂的免费在线观看| 亚洲视频在线观看视频| 成人免费视频观看无遮挡| 美女隐私免费视频看| 亚洲精品卡2卡3卡4卡5卡区| 久久国产乱子伦精品免费看| 亚洲一级毛片免费在线观看| 四虎永久免费地址在线网站| GOGOGO高清免费看韩国| 久久亚洲春色中文字幕久久久| 在线视频观看免费视频18| 国产成人 亚洲欧洲| 亚洲成a人片在线观看日本| 97在线观看永久免费视频| 亚洲国产精品无码中文lv| 亚洲男人的天堂www| 98精品全国免费观看视频| 亚洲人成网站999久久久综合| 免费成人av电影| 蜜桃成人无码区免费视频网站 | 亚洲小说区图片区另类春色| 91免费在线播放| 免费无码专区毛片高潮喷水| 亚洲成人午夜在线| 国产一区视频在线免费观看|