Шаблон фабрика(фабричный метод) создает объекты в зависимости от контекста.
Помимо создания нужно унаследовать как прототип фабрики, так и прототип используемого конструктора.
Как это грамотно реализовать?
Код:
define(['TankModel', 'ShipModel'], function (Tank, Ship) {
// Factory GameModel
function GameModel() {}
// общие методы, которые наследуются всеми
GameModel.prototype.getType = function () {
console.log('this getType');
};
// фабричный метод
// type - тип конструктора
// params - данные для конструктора
GameModel.factory = function (type, params) {
var object;
// вывести ошибку, если конструктор
// для запрошенного типа отсутствует
if (typeof GameModel[type] !== 'function') {
throw {
name: 'Error',
message: type + ' не существует'
}
}
// тут нужно унаследовать содержимое фабричного прототипа
// делать это каждый раз при использовании одних и тех же конструкторов не нужно
if (typeof GameModel[type].prototype.getType !== 'function') {
GameModel[type].prototype = new GameModel();
}
// тут возвращается объект от конструктора [type]
object = new GameModel[type]();
// работа с готовым объектом:
// это метод конструктора
object.initialize(params);
// это метод фабрики
object.getType();
return object;
};
// делает танки
GameModel.tank = Tank;
// делает корабли
GameModel.ship = Ship;
return GameModel;
});
Создание объекта:
var tank = GameModel.factory('tank');
var ship = GameModel.factory('ship');
Эта фабрика не работает. Фабричные методы затираются при вызове конструктора