Javascript 如何用RequireJS实现工厂设计模式?

Javascript 如何用RequireJS实现工厂设计模式?,javascript,requirejs,Javascript,Requirejs,我有这样的东西 define(['ClassA', 'ClassB', 'ClassC'], function(ClassA, ClassB, ClassC) { return { build: function(className) { var obj; switch(className) { case 'ClassA': obj = new ClassA(); break;

我有这样的东西

define(['ClassA', 'ClassB', 'ClassC'], 
  function(ClassA, ClassB, ClassC) 
  {
    return {
      build: function(className) {
        var obj;
        switch(className)
        {
            case 'ClassA': obj = new ClassA(); break;
            case 'ClassB': obj = new ClassB(); break;
            case 'ClassC': obj = new ClassC(); break;
        }
        return obj;
    }
  }
}
这看起来还可以,但是有没有更好的方法来写呢?我试着把开关换成新的

return new arguments[className]();    // doesn't work
我最接近的方法是使用地图:

var classes = {
    ClassA: ClassA,
    ClassB: ClassB,
    ClassC: ClassC
}
return new classes[className]();

有更好的方法吗?

那里的对象确实没有问题。
它快速、高效且易于操作。
我唯一的建议是创建一个var来保存该值,或者更明确地测试
className
是否是一个合适的字符串,并且实际上在您的列表中:

要么:

var construct = classes[className];
if (construct) { return new construct(); }
else { /* handle the case where the class doesn't exist */ }
或:

第二个检查类[className],如果存在,则应返回一个新实例(JS返回and右边的值)…
或者它将返回
null

也许
null
不是您想要的。
但关键是,尽管没有
Bob
类,但您应该准备好处理将:
“Bob”
传递到工厂的人。

使用:


我投票赞成map解决方案。代码最少,而且是显式的。缺点是requirejs将加载所有3个文件ClassA.js、ClassB.js和ClassC.js,而不是只加载所需的文件。@koral你完全正确。当然,这是否是一个缺点,取决于大量的分析,包括它们被共同使用的页面数量、每个页面的大小、缩小程度以及一个大文件的平均传输时间,而三个小文件则不能使用相同的套接字(当然,因为您使用的是TLS)因此遭受多次握手。。。这不是一个规模,永远的对象;复杂性和管理开销应该与正在完成的工作的范围处于同一水平。我想知道你为什么否决了建议的解决方案。在我的例子中,这来自于一个真正的实现,当一个人只需要所需的依赖项时。
return classes[className] && (new classes[className]()) || null;
define(function(require){
    var classes = {
        'ClassA' : require('ClassA'),
        'ClassB' : require('ClassB'),
        'ClassC' : require('ClassC')
    };

    return function(className){
        try {
            return new classes[className];
        } catch(error) {
            throw new Error('Unknown className Specified.');
        }
    }
});