JavaScript 設計模式之----單體(單例)模式

來源:互聯網
上載者:User

JavaScript 設計模式之----單體(單例)模式
設計模式之—-單體(單例)模式

1、介紹

從本章開始,我們會逐步介紹在JavaScript裡使用的各種設計模式實現,在這裡我不會過多地介紹模式本身的理論,而只會關注實現。OK,正式開始。

在傳統開發工程師眼裡,單例就是保證一個類只有一個執行個體,實現的方法一般是先判斷執行個體存在與否,如果存在直接返回,如果不存在就建立了再返回,這就確保了一個類只有一個執行個體對象。在JavaScript裡,單例作為一個命名空間提供者,從全域命名空間裡提供一個唯一的訪問點來訪問該對象。

2、 簡單單體與閉包單體

在JavaScript裡,實現單例的方式有很多種,其中最簡單的一個方式是使用對象字面量的方法,其字面量裡可以包含大量的屬性和方法:

<script> //單體模式(sigleton)--無法new();因為他已經真是存在了 /*1、簡單單體--對象自變數的模式*//* var Sigleton ={ attr1 : true, attr2 : 10, method1: function(){ alert(我是方法1);},method2 : function(){ alert(我是方法2);} }; alert(Sigleton.attr1); //單體模式主要是劃分命名空間,區分不同人之間的代碼 var BHX =BHX || {}; BHX.Sigleton ={ attr1 : true,attr2 : 10,method1: function(){alert(我是方法1);},method2 : function(){ alert(我是方法2);} }; BHX.Sigleton.method1();*/ /*2、閉包單體---借用閉包穿簡單體(閉包的主要目的:保護資料)*/ //命名空間--塊級範圍的實現 /* (function test(){ alert(11); })()*/ var BHX = BHX || {}; BHX.Sigleton2=(function(){ //用閉包的作用就是把自己的私人屬性給封裝起來,不讓外界訪問。只有return暴露出來才能訪問。 var a1 = true; var a2 = 10; var f1 = function(){ alert(function f1); }; var f2 = function(){ alert(function f2); }; //要把塊級範圍的東西賦值給Sigleton2,要有return語句。 return{ attr1 : true, attr2 : 10, method1: function(){ return f1(); }, method2 : function(){ return f2; } }; })(); alert(BHX.Sigleton2.attr1); BHX.Sigleton2.method1(); </script>

上面的代碼很不錯了,但如果我們想做到只有在使用的時候才初始化,那該如何做呢?為了節約資源的目的,我們可以另外一個建構函式裡來初始化這些代碼,如下:

3、 惰性單體和分支單體
<script> /*3、惰性單體---(和閉包單體有一些相似的地方)但是可以用變數來控制要返回那些內容,而不是所有的都返回,這樣在大項目中很有好處*/ //命名空間 var BHX = BHX || {}; BHX.Base =(function(){ //利用私人變數控制 返回的單體對象 var uniqueInstance; //undefined //需要一個構造器init 初試化對象的方法 function init(){ var a1 = true; var a2 = 10; var f1 = function(){ alert(function f1); }; var f2 = function(){ alert(function f2); }; return{ attr1 : true, attr2 : 10, method1: function(){ return f1(); }, method2 : function(){ return f2; } }; }; return { getInstance:function(){ if (!uniqueInstance) { //如果不存在,則建立單體執行個體 uniqueInstance =init(); }; return uniqueInstance; } }; })(); //BHX.Base.getInstance().method1(); /*4、分支單體--和swich if else類似,可以用於底層架構瀏覽器的差異性檢測*/ var Ext =Ext ||{}; var diff = true; Ext.More =(function(){ var ObjA={ //Firefox瀏覽器 //屬性1 attr1:Firefox屬性1 //屬性2 //方法1 //方法2 }; var ObjB={ //屬性1 attr1:IE屬性1 //屬性2 //方法1 //方法2 }; return (diff)? ObjA : ObjB; })(); alert(Ext.More.attr1);</script>

知道了單例如何?了,但單例用在什麼樣的情境比較好呢?其實單例一般是用在系統間各種模式的通訊協調上,下面的代碼是一個單例的最佳實務:

4、 最佳實務
var SingletonTester = (function () {    //參數:傳遞給單例的一個參數集合    function Singleton(args) {        //設定args變數為接收的參數或者為空白(如果沒有提供的話)        var args = args || {};        //設定name參數        this.name = 'SingletonTester';        //設定pointX的值        this.pointX = args.pointX || 6; //從接收的參數裡擷取,或者設定為預設值        //設定pointY的值        this.pointY = args.pointY || 10;    }    //執行個體容器    var instance;    var _static = {        name: 'SingletonTester',        //擷取執行個體的方法        //返回Singleton的執行個體        getInstance: function (args) {            if (instance === undefined) {                instance = new Singleton(args);            }            return instance;        }    };    return _static;})();var singletonTest = SingletonTester.getInstance({ pointX: 5 });console.log(singletonTest.pointX); // 輸出 5 
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.