2012-11-12 234 views
4

我要找的建議在此實現工廠設計模式的Backbone.js的集合是否是一個壞的實現。Backbone.js的工廠設計模式實現

Collections.MyObjects = Backbone.Collection.extend({ 

    model: Models.MyObject 

}); 

Collections.MyObjects.getInstance = (function(){ 

    var instances = {}, 
     defaultName = 'default'; 

    return function(name) 
    { 
     name = name || defaultName; 

     if (!instances[name]) 
     { 
      instances[name] = new Collections.MyObjects(); 
     } 

     return instances[name]; 
    }; 

})(); 

我正在尋找替代實現和性能優化/理論。

+0

你可能想提供一種方法來刪除實例,否則'instances'對象將永遠指向生成的每個實例。 – numbers1311407

+0

@ numbers1311407非常好的一點。在我的實現中,我實際上希望只使用默認名稱來知道,但是您的觀點對於實現肯定是有效的。你有什麼建議可以巧妙實施? –

+0

如果你的代碼是一個模塊(requireJS等),有好多沒有必要私有化'instances'變量,你可以在上面用盡可能多的功能,你只想要工作。如果不是,你可以在同一個閉包中包裝(獲取和刪除實例)函數定義。 – numbers1311407

回答

1

這裏有一個替代實現由@ numbers1311407對問題的意見的啓發。

Collections.MyObjects = Backbone.Collection.extend({ 

    model: Models.MyObject 

}); 

Collections.MyObjects.instance = (function(){ 

    var instances = {}, 
     defaultName = 'default'; 

    return { 
     "get": function(name) { 
      name = name || defaultName; 

      if (!instances[name]) 
      { 
       instances[name] = new Collections.MyObjects(); 
      } 

      return instances[name]; 
     }, 
     "delete": function(name) { 
      name = name || defaultName; 

      if (!instances[name]) return false; 

      delete instances[name]; 
      return true; 
     } 
    }; 

})(); 

未經測試。