Фабричный шаблон в JavaScript - PullRequest
5 голосов
/ 02 мая 2011

Я хочу отделить создание объектов 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 Ответ

2 голосов
/ 02 мая 2011

Просто используйте Object.create() вместе с прокладкой ES5 следующим образом: https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js

Он делает большую часть того, что вы хотите, и делает то, что делает ES5, когда это действительно становится стандартом. Учитывая общий случай использования одного объекта в качестве прототипа для другого, он прекрасно работает во всех браузерах.

...