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

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

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

    細心!用心!耐心!

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

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

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

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

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

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

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

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

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

    取得Runtime物件之後,您可以透過它進行一些外部命令的執行、進行垃圾處理等等指令,您可以開啟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() {}

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

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

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

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

            return instance;
        }

        // .. 其它實作
    }

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

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

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

    在多執行緒的環境下,為了避免資源同時競爭而導致如上產生多個實例的情況,加上同步(synchronized)機制:
    public class Singleton {
        private static Singleton instance = null;
        private Singleton(){}
        synchronized static public Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
     
    不過這種簡單的寫法不適合用於像伺服器這種服務很多執行緒的程式上,同步機制會造成相當的效能低落,為了顧及Singleton、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本身的觀念簡單但應用很廣,因而很多時候必須對實際環境作一些考量與調整,建議您也看看有關於Singleton的這篇 討論
    posted on 2007-04-17 10:33 張金鵬 閱讀(242) 評論(0)  編輯  收藏 所屬分類: Creational 模式
    主站蜘蛛池模板: 亚洲精品在线免费观看视频| 亚洲日产乱码一二三区别 | 亚洲国产精品日韩专区AV| 亚洲精品无码专区久久| 全免费a级毛片免费**视频| 国产成+人+综合+亚洲专| 免费毛片a在线观看67194| 亚洲一卡2卡4卡5卡6卡在线99| 18女人毛片水真多免费| 亚洲视频网站在线观看| 免费观看激色视频网站bd| 亚洲乱人伦精品图片| 四虎成人免费影院网址| 真正全免费视频a毛片| 久久亚洲色一区二区三区| 精选影视免费在线 | 亚洲国产成人片在线观看| 99精品国产成人a∨免费看| 亚洲精品中文字幕乱码| 无码中文在线二区免费| 在线观看亚洲网站| 亚洲中文字幕丝袜制服一区| 中文字幕视频在线免费观看| 久久精品国产亚洲av日韩| 免费A级毛片无码无遮挡内射| 亚洲欧美日韩中文字幕在线一区| 免费人成激情视频| 免费日本一区二区| 亚洲AV综合色区无码二区偷拍| 日本高清色本免费现在观看| 国产免费久久精品丫丫| 亚洲综合在线视频| 在线观着免费观看国产黄| 亚洲一区二区三区免费| 亚洲午夜久久久精品电影院| 成人免费视频国产| 无码人妻一区二区三区免费n鬼沢| 亚洲不卡中文字幕| 2022中文字字幕久亚洲| 日本免费网址大全在线观看| 免费人成大片在线观看播放|