摘要:代碼示例代碼中創建了一個單例的包裝器,使用的示例代碼如下因為是單例,因此,我們可以把對象的方法直接放在上,而不用放在的對象上。我們可以使用一個單例池來保存不同構造器的單例,用來標識是否為該構造器生成單例,并作為下標索引獲取該單例。
1. 簡介
Singleton(單例)模式的理解要從兩個方面
它限制了類的實例化次數只能為一次,即在該實例不存在的情況下,可以通過一個方法創建對象實例,如果實例已經存在,則返回該對象的引用。
它不同于靜態類(對象),單例可以推遲初始化,這一點很重要,因為可以推遲初始化,就意味著不用過早地為單例分配內存資源,而是可以當需要使用時,才對其進行初始化,分配對應的內存空間。
單例的存在,在一些時候并不是好事,可能它的出現時因為系統中的模塊要么是系統緊密耦合,要么是其邏輯過分分散。
2. 代碼示例var singleton = (function () { var instance; return { getInstance : function (factory){ var args = Array.prototype.slice.call(arguments, 1); if(!instance){ instance = {}; factory.apply(instance, args); } return instance; } } })();
代碼中創建了一個單例的包裝器,使用的示例代碼如下
function Person(name, age){ this.name = name; this.age = age; this.sayName = function () { console.log(this.name); } } var p1 = singleton.getInstance(Person, "zhang", 25); var p2 = singleton.getInstance(Person); console.log(p1 == p2); // true console.log(p2.sayName()); // "zhang"
因為是單例,因此,我們可以把對象的方法直接放在this上,而不用放在Person的prototype對象上。但是這段代碼還有不足,那就是只能產生一個構造器的單例,我們可以來對其進行改進。
var singleton = (function () { var instances = [], guid = 0; return { getInstance : function (factory){ var args = Array.prototype.slice.call(arguments, 1); if(typeof factory._guid == "undefined"){ instances[guid] = {}; factory.apply(instances[guid], args); factory._guid = guid++; } return instances[factory._guid]; } } })();
我們可以使用一個單例池(instances)來保存不同構造器的單例,用_guid來標識是否為該構造器生成單例,并作為下標索引獲取該單例。使用示例:
function Person(name, age){ this.name = name; this.age = age; this.sayName = function () { console.log(this.name); } } var p1 = singleton.getInstance(Person, "zhang", 25); var p2 = singleton.getInstance(Person); console.log(p1 == p2); // true console.log(p2.sayName()); // "zhang" function Car(brand){ this.brand = brand; this.sayBrand = function () { console.log(this.brand); } } var c1 = singleton.getInstance(Car, "benchi"); var c2 = singleton.getInstance(Car); console.log(c1 == c2); // true console.log(c2.sayBrand()); // "benchi"
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91082.html
摘要:簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類。中的就是簡單工廠模式的體現,根據傳入一個唯一的標識來獲得對象,但是否是在傳入參數后創建還是傳入參數前創建這個要根據具體情況來定。中的就是典型的工廠方法模式。 showImg(https://segmentfault.com/img/bVbwbd9?w=640&h=492); 一. 簡單工廠又叫做靜態工廠方法(...
摘要:在面向對象的語言中,比如,等,單例模式通常是定義類時將構造函數設為,保證對象不能在外部被出來,同時給類定義一個靜態的方法,用來獲取或者創建這個唯一的實例。 萬事開頭難,作為正經歷菜鳥賽季的前端player,已經忘記第一次告訴自己要寫一些東西出來是多久以的事情了。。。如果,你也和我一樣,那就像我一樣,從現在開始,從看到這篇文章開始,打開電腦,敲下你的第一篇文章(或者任何形式的文字)吧。 ...
摘要:不符合設計模式中的單一職責的概念。引入代理實現單例模式引入代理實現單例模式的特點我們負責管理單例的邏輯移到了代理類中。的單例模式對比在以上的代碼中實現的單例模式都混入了傳統面向對象語言的特點。 聲明:這個系列為閱讀《JavaScript設計模式與開發實踐》 ----曾探@著一書的讀書筆記 1.單例模式的特點和定義 保證一個類僅有一個實例,并且提供一個訪問它的全局訪問點。 2.傳統面向對...
摘要:簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類。中的就是簡單工廠模式的體現,根據傳入一個唯一的標識來獲得對象,但是否是在傳入參數后創建還是傳入參數前創建這個要根據具體情況來定。 設計模式作為工作學習中的枕邊書,卻時常處于勤說不用的尷尬境地,也不是我們時常忘記,只是一直沒有記憶。 Spring作為業界的經典框架,無論是在架構設計方面,還是在代碼編寫方面,都堪...
閱讀 1120·2021-11-25 09:43
閱讀 1569·2021-10-25 09:47
閱讀 2466·2019-08-30 13:46
閱讀 753·2019-08-29 13:45
閱讀 1280·2019-08-26 13:29
閱讀 2990·2019-08-23 15:30
閱讀 1103·2019-08-23 14:17
閱讀 1326·2019-08-23 13:43