大熊君說說JS與設計模式之------單例模式Singleton()


一,總體概要

1,筆者淺談

顧名思義單例模式並不難理解,是產生一個類的唯一實例,在我們實際開發中也會使用到這種模式,它屬於創建模式的一種,基於JS語言本身的語法特征,

對象直接量“{}”,也可以作為單例模式的一種表現形式,如下代碼參考

 1 function Foo(){
 2     this.bar = "Hello Singleton !" ;
 3 } ;
 4 var Singleton = {
 5     instance : null ,
 6     getInstance : function(){
 7         if(!this.instance){
 8             this.instance = new Foo() ;
 9         }
10         return this.instance ;
11     }
12 } ;

就像這樣當我們每次調用 Singleton.getInstance()時,就會得到唯一的實例。

單例模式是javascript最基本,最有用的模式之一,它提供了一種將代碼組織為一個邏輯單元的手段,這個邏輯單元中的代碼通過單一的變量進行訪問。

單體在javascipt中有許多用處,可以用來划分命名空間,以減少全局變量的泛濫。還可以用在分支技術中用來處理各瀏覽器的差異。然我們再看幾個例子(*^__^*) 

 1 var Singleton = (function(){
var instance = null ;
2 function Foo(){ 3 this.bar = "Hello Singleton !" ; 4 } ; 5 return{ 6 getInstance : function(){ 7 if(!instance){ 8 instance = new Foo() ; 9 } 10 return instance ; 11 } 12 } ; 13 })() ;

這是通過模塊模式實現的。

 1 var Singleton = (function(){
var instance = null ;
2 function Foo(){ 3 this.bar = "Hello Singleton !" ; 4 } ; 5 function createInstance(){ 6 return new Foo() ; 7 } ; 8 return{ 9 getInstance : function(){ 10 if(!instance){ 11 instance = createInstance() ; 12 } 13 return instance ; 14 } 15 } ; 16 })() ;

這是結合工廠模式實現的單例方式。

單例模式是設計模式中最簡單的形式之一。這一模式的目的是使得類的一個對象成為系統中的唯一實例。要實現這一點,可以從客戶端對其進行實例化開始。因此需要用一種只允許生成對象類的唯一實例的機制,“阻止”所有想要生成對象的訪問。使用工廠方法來限制實例化過程。這個方法應該是靜態方法(類方法),因為讓類的實例去生成另一個唯一實例毫無意義。

 

二,源碼案例參考

我們拿Bootstrap前端框架作為實例進行講解,以下說的是"alert.js v3.3.1"中的源碼,如下所示

 

這一這句代碼,if (!data) $this.data('bs.alert', (data = new Alert(this)))這就是單例的方式創建組件的實例對象,通過查找緩存在DOM節點的對象判斷是否創建實例。

再給大家幾個例子鞏固單例模式的組織方式以及如何使用

 

再看一個,這屬於惰性加載。

三,案例引入

今天我們將結合單例模式與工廠模式做一個小例子,以理解為主。

(1),創建單例類

 1 var Singleton = (function(){
 2     var instance = null ;
 3     function createInstance(type){
 4         return factory.create(type) ;
 5     } ;
 6     return{
 7         getInstance : function(type){
 8             if(!instance){
 9                 instance = createInstance(type) ;
10             }
11             return instance ;
12         }
13     } ;
14 })() ;

 

(2),創建工廠類

 1 var factory = (function(){
 2     var instanceVendor = {
 3         "foo" : function(){
 4             return new Foo() ;
 5         } ,
 6         "zoo" : function(){
 7             return new Zoo() ;
 8         }
 9     } ;
10     return {
11         create : function(type){
12             return instanceVendor[type]() ;
13         }
14     } ;
15 })() ;

 

(3),創建實體對象類

1 function Foo(){
2     this.bar = "Hello Singleton !" ;
3     this.getBar = function(){
4         return this.bar ;
5     } ;
6 } ;

(4),創建客戶端測試類

1 function SingleClient(){
2     this.run = function(){
3         Singleton.getInstance("foo").getBar() ; // Hello Singleton !
4     } ;
5 } ;

 

四,總結一下

單例模式的要點有三個。
一,是某個類只能有一個實例;
二,是它必須自行創建這個實例;
三,是它必須自行向整個系統提供這個實例。
從具體實現角度來說,就是以下三點。
一,是單例模式的類只提供私有的構造函數,
二,是類定義中含有一個該類的靜態私有對象,
三,是該類提供了一個靜態的共有的函數用於創建或獲取它本身的靜態私有對象。
 
 
哈哈哈,本篇結束,未完待續,希望和大家多多交流夠溝通,共同進步(*^__^*) 嘻嘻……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM