JavaScript中的工厂模式

时间:2011-05-02 17:41:25

标签: javascript factory-pattern

我希望将JavaScript对象的创建与使用它的代码分离,以便我可以灵活地将一个对象实现替换为具有相同签名的其他对象实现,而无需触及大部分代码。为了实现这一点,我想出了Repository和Factory Method的概念来创建对象。以下是实施:

//The Factory Method
function ObjectFactory() {}
ObjectFactory.create = function (o) {
    var args = [].slice.call(arguments, 1);

    function F() {}
    F.prototype = o.prototype;
    var instance = new F();
    o.apply(instance, args);
    return instance;
};

//The Repository
var Repository = {
    'invitation': Invitation,
    'message': Message
};

//Usage
var inv = ObjectFactory.create(Repository["invitation"], "invitation", "invitation body", "Sender");
var msg = ObjectFactory.create(Repository["message"], "message", "message body");
var inv2 = ObjectFactory.create(Repository["invitation"], "invitation2", "invitation body2", "Sender");

这个模式对我有用,但在我继续在我的项目中实现这个代码之前我想知道是否存在任何陷阱(模式创建对象失败,性能瓶颈 - 如果我将创建5-10个对象使用这种方法的200到1000行代码。我在使用服务器端代码很长一段时间后回到JavaScript,所以我对我的解决方案不是很有信心。此外,我本可以使用ES5 Object.create,但客户现在仍然使用IE8和FF3.6浏览器。

由于

1 个答案:

答案 0 :(得分:2)

只需使用Object.create()以及ES5垫片:https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js

它完成了你想要的大部分工作,并且在实际成为标准的时候做了ES5的工作。鉴于使用一个对象作为另一个对象的原型的常见情况,它在所有浏览器中都可以正常工作。