2012-11-12 136 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; 
     } 
    }; 

})(); 

未经测试。