类工厂是有效的javascript模式吗?
不久前,我学到了很多设计模式,特别是创意模式。 过了一段时间,我发现自己使用了一种我认为存在的模式,但当我试图搜索它时,我没有找到任何参考。基本上,它是对工厂的一个小修改,利用闭包来解决类的依赖关系。实际上,它是一个类工厂。让我用一些代码来说明这一点:类工厂是有效的javascript模式吗?,javascript,design-patterns,Javascript,Design Patterns,不久前,我学到了很多设计模式,特别是创意模式。 过了一段时间,我发现自己使用了一种我认为存在的模式,但当我试图搜索它时,我没有找到任何参考。基本上,它是对工厂的一个小修改,利用闭包来解决类的依赖关系。实际上,它是一个类工厂。让我用一些代码来说明这一点: function Factory(depA,depB){ function MyClass(something){ this.something = something; } MyClass.proto
function Factory(depA,depB){
function MyClass(something){
this.something = something;
}
MyClass.prototype.methodA(){ // use depA}
MyClass.prototype.methodB(){ // use depB}
return MyClass
}
让我们假设depA是一个数据库,depB是一个记录器。然后你可以像这样使用工厂
var BindedClass = Factory(database,logger);
var instance = new BindedClass(something);
我发现这种模式对于注入公共依赖项非常有用,而不会失去对类实际实例化方式的控制
然而,这也有一些问题。例如,让我意识到这并不常见的一件事是JSDoc根本不支持这种模式
这是一个坏模式吗?除了较少的模块化和非工作文档工具之外,我找不到它的任何缺点 是的,这是一种完全被接受的模式。然而,我们很少称之为“工厂”,更常见的是“模块”——在本例中是依赖注入。许多像AMD这样的模块系统都使用这种模式
但是,您应该确保工厂生成一个单例,即不应多次调用工厂,也不应创建多个类似的类。是的,这是完全可以接受的模式。然而,我们很少称之为“工厂”,更常见的是“模块”——在本例中是依赖注入。许多像AMD这样的模块系统都使用这种模式
但是,您应该确保工厂生成一个单例,即不应多次调用
factory
并创建多个类似的类。如果您将BindedClass
存储在某个位置并多次调用new BindedClass()
,我认为这有一定的意义。如果您只是计划一直连续执行这两行,那么您最好让工厂
将某物
作为参数,并让它返回一个普通对象。亲爱的@JLRishe,这个想法确实是这样做的。在任何情况下,与POJO相比,使用一个类也有一些优势,即使您只是将这两行紧密地运行。如果您将BindedClass
存储在某个位置并多次调用newbindedclass()
,我想这会有一定的意义。如果您只是计划一直连续执行这两行,那么您最好让工厂
将某物
作为参数,并让它返回一个普通对象。亲爱的@JLRishe,这个想法确实是这样做的。在任何情况下,与POJO相比,使用类也有一些优势,即使您只需要将这两行彼此靠近运行。谢谢@Bergi的回答。你为什么认为应该是单身?如果我想使用工厂创建几个具有不同依赖关系的类,该怎么办?你知道用JSDoc成功记录这一点的方法吗?谢谢创建几个相似的类会导致继承关系和可共享的重复方法出现问题。如果您真的需要,我建议在这种情况下让每个类从公共基类继承。如果您需要几个具有不同依赖关系的实例,您可能还需要考虑将依赖注入注入实例创建过程中。(当然:在您的测试环境中,多次致电工厂测试DI是完全可以的)不,我不知道JSDoc,我只是经常听说它不适合更复杂的情况。您知道其他选择吗?谢谢@Bergi的回答。你为什么认为应该是单身?如果我想使用工厂创建几个具有不同依赖关系的类,该怎么办?你知道用JSDoc成功记录这一点的方法吗?谢谢创建几个相似的类会导致继承关系和可共享的重复方法出现问题。如果您真的需要,我建议在这种情况下让每个类从公共基类继承。如果您需要几个具有不同依赖关系的实例,您可能还需要考虑将依赖注入注入实例创建过程中。(当然:在您的测试环境中,多次打电话给工厂测试DI是完全可以的)不,我不知道JSDoc,我只是经常听说它不适合更复杂的情况。您知道其他替代方案吗?