js設計模式——單例/單體模式
阿新 • • 發佈:2019-02-14
JavaScript中的單例模式是最常用的、最基本的設計模式,它提供了一種名稱空間,減少全域性變數氾濫的程式碼管理機制;
1、最常見的單例模式:
//一般用function定義的類,我才會採用首字母大寫的方法來約定這個變數為類
//而對於這種偽類,我通常習慣於使用駝峰式命名法
var singleton = {
attr1: '',
attr2: '',
method1: function() {},
method2: function() {}
};
這是JavaScript開發中最常用的程式碼組織方式,這種方式在JavaScript執行的時候,就已經建立了例項物件。這樣建立的例項物件,所有的屬性、方法都是公開的,有一定的風險;一般使用這樣的單例模式,我們可以採用下劃線_來命名私有變數,來約定為私有變數。但是很不靠譜!
2、閉包方法的單例模式:
var singleton = (function() { var _a, _b; //私有變數 var that = {}; //new某個類 //公開介面 that.getA = function() { return _a; }; that.setA = function(a) { _a = a; }; that.getB = function() { return _b; }; that.setB = function(b) { _b = b; }; return that; //返回單例 })();
以上這種方法,實現了單例的私有變數對使用者透明,使用者所能知道的只有公開的介面,不能隨意改變私有變數,但是這種方法還是在執行腳步的時候就產生了一個單例,使用者有可能根本就不使用這段程式碼,這樣就會造成記憶體浪費,更好的做法是將類的例項化推遲到需要的時候再例項化;
3、lazy方式的單例模式:
var singleton = (function() { var _a, _b; //私有變數 var Class = function() { //code }; var that = {}; //公開介面 that.getA = function() { return _a; }; that.setA = function(a) { _a = a; }; that.getB = function() { return _b; }; that.setB = function(b) { _b = b; }; var _instance = null; var getInstance = function() { if(!_instance) { _instance = new Class(); } return _instance; }; Class.prototype = that; return { getInstance: getInstance }; })();
那麼這種方法就可以在確實需要這段程式碼的時候,才例項化,實現懶惰性的單例模式!