Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   фабрика в javascript (https://javascript.ru/forum/misc/29273-fabrika-v-javascript.html)

tadjik1 21.06.2012 19:57

фабрика в javascript
 
Привет.
Недавно совсем узнал о таком понятии как фабрика, хотелось бы спросить, в каких случаях её стоить применять, каким образом это делать лучше, на чем основано её применение?

tadjik1 22.06.2012 13:01

то есть, фабрика — это объект, который содержит ссылки на конструкторы?

у меня есть 4 конструктора (Backbone.View), я не хочу знать о каждом из них. я просто создаю объект, который имеет метод create и знает обо всех 4 конструкторах. передавая в create тип вью, который мне надо получить, я его и получаю.

так?

var a1 = Backbone.View({});
var a2 = Backbone.View({});
var a3 = Backbone.View({});
var a4 = Backbone.View({});

function b() {
  var types = {
    first: a1,
    second: a2,
    third: a3,
    fourth: a4
  };

  return {
    create: function (type) {
      var c;
      c = new types[type]();
      return c;
    }
  }
}

var d = new b();

d.create('first'); //мне не нужно знать, какой именно конструктор это сделает, достаточно просто сказать, что я хочу получить

melky 22.06.2012 13:30

Цитата:

Сообщение от tadjik1 (Сообщение 183090)
Привет.
Недавно совсем узнал о таком понятии как фабрика, хотелось бы спросить, в каких случаях её стоить применять, каким образом это делать лучше, на чем основано её применение?

Этот шаблон применяется, когда нужно выполнить повторяющиеся операции при создании похожих объектов. Объекты, созданные таким образом, обычно имеют один прототип. Самое главное, эти объекты являются подклассами, которые реализуют специализированные функциональные возможности.

Пример кода - классический пример фабрики.
function factory() {}

// это будет у всехэкземпляров, созданных фабрикой
factory.prototype.say = function(){ 
    alert( "Привет. Я : " + this.sex );
}

// фабричный метод
factory.make = function(type){
    var copy;

    // чтобы каждый раз не устанавливать прототип.
    if (factory[type].prototype.say === undefined) {
        factory[type].prototype = new factory();
    }

    copy = new factory[type]();

    // что-нибудь ещё добавляем.
    copy.creationTime = Date.now();

    return copy;
}

// конструкторы узкоспециализированных классов.
factory.male = function() {
    this.sex = "male";
};
factory.female = function() {
    this.sex = "female";
};

// использование
var one = factory.make("male");
var two = factory.make("female");

one.say();
two.say();

melky 22.06.2012 14:00

Maxmaxmахimus, ты знаешь, что такое паттерн "стратегия"?

Цитата:

Сообщение от Maxmaxmахimus
круто, ты описал конструкторы))

круто взять и перебить на первых словах, не дочитав до конца :yes:
Цитата:

Сообщение от Maxmaxmахimus
это что за возможности такие? я что-то ни одной не нашел.

а в factory.male что?
Цитата:

Сообщение от Maxmaxmахimus
Но нормальные пасоны делают не через жопу, а как задуманно:

Где тут фабрика?
Цитата:

Сообщение от Maxmaxmахimus
Фабрика нужна чтобы работать без оператора new, больше она не зачем не нужна имхо.

окей.
Это фабрика что-ли, по-твоему?
function Universe(){
    if (!(this instanceof Universe)) return new Universe();
    this.foo = "bar";
}

Universe();

tadjik1 22.06.2012 14:06

это синглтон)) вот с ним я разобрался, а теперь не могу нкиак догнать применимость в фабрики в проекте с бекбоном.

подскажите, пожалуйуста, всё ли я правилно понял в примере, который привел? конструкторами там являются backbone.view

melky 22.06.2012 14:12

Цитата:

Сообщение от tadjik1
это синглтон)) вот с ним я разобрался,

не разобрался. Это не синглтон. Оный - один и тот же объект :
// первый пример
var singleton = {  /* обычный хеш */  };

// второй пример
// при вызове возвращается уже давно созданный объект
function Universe(){
    var uni = {}; // это он
    Universe = function(){
        return uni;
    }

    return uni;
}

Цитата:

Сообщение от tadjik1
теперь не могу нкиак догнать применимость в фабрики в проекте с бекбоном.

что Вам именно нужно?

Цитата:

Сообщение от tadjik1
подскажите, пожалуйуста, всё ли я правилно понял в примере, который привел? конструкторами там являются backbone.view

и да, и нет. фабрика не преследует цели скрыть от пользователя-программиста реализацию.


Цитата:

Сообщение от Maxmaxmахimus
Фабрика нужна чтобы работать без оператора new, больше она не зачем не нужна.

Цитата:

Сообщение от Maxmaxmахimus
я сказал что ОСНОВНАЯ СУТЬ фабрики в отсутствии оператора new?

нет. ты сказал, что это её единственная цель :lol:

Цитата:

Сообщение от Maxmaxmахimus
ПОКА это лишь ненужный запутывающий паттерн

ты его просто не понял \ не знаешь.

tadjik1 22.06.2012 14:20

Цитата:

Сообщение от melky
что Вам именно нужно?

melky,
в проекте будут использоваться формы, причем их будет много (разный дизайн, разные правила валидации и наполнение).

одна форма — это будет одна модель и одна вью бекбон. а вот для построения должена использоваться фабрика.

tadjik1 22.06.2012 14:22

Цитата:

Сообщение от melky
не разобрался. Это не синглтон. Оный - один и тот же объект :
// первый пример
var singleton = {  /* обычный хеш */  };
 
// второй пример
// при вызове возвращается уже давно созданный объект
function Universe(){
    var uni = {}; // это он
    Universe = function(){
        return uni;
    }
 
    return uni;
}

последние дни провожу в обнимку с книгой Стефанова «паттерны яваскрипт», в ней этот способ указан как «создание синглтона через экземпляр в замыкании»

var a = new Universe();
var b = new Universe();

a === b //true

tadjik1 22.06.2012 14:28

блин, опять всё сваливается в разговоры «ты не знаешь, я знаю, ты не прав, я прав». предлагаю не вестить на провокации, каждый думает в меру своего профессионализма)

я вот до сих пор не понимаю, каким образом применять фабрику в бекбоновом проекте) созадёт ли сам бекбон еще один уровень абстрации или нет. ведь с однйо стороны вью расширяют стандартный класс бекбона, с другой стороны вы приводите примеры фабрик «на самом примитивном уровне». видимо я совсем не пойму сути, поэтмоу очень прошу вас указать на хорошие источники, либо объяснить на конкретном примере (коде, который я привел).

melky 22.06.2012 14:31

Цитата:

Сообщение от tadjik1 (Сообщение 183305)
melky,
в проекте будут использоваться формы, причем их будет много (разный дизайн, разные правила валидации и наполнение).

одна форма — это будет одна модель и одна вью бекбон. а вот для построения должена использоваться фабрика.

так ... а зачем нужна именно она, а не простой конструктор с прототипом?

Цитата:

Сообщение от tadjik1 (Сообщение 183307)
последние дни провожу в обнимку с книгой Стефанова «паттерны яваскрипт», в ней этот способ указан как «создание синглтона через экземпляр в замыкании»

там же есть описание паттерна "Фабрика" ... всё разжёвано до состояния жидкости.

Цитата:

Сообщение от Maxmaxmахimus
Ну так просвятиии меня) что я и прошу)) я же не хочу блуждать во тме невежества и лолжных представлений о чем -то ))) просвяти меня чтобы я узрел свет и истину про этот паттерн XD

не вопрос, чувак.
http://javascript.ru/forum/183277-post4.html
читай :lol:

Цитата:

Сообщение от Maxmaxmахimus
зачем же он нужен)?? чтобы делать "стратегию" что ли?

а люди, для того, чтобы делать людей :D
нет, просто у этих двух есть общие черты.


Часовой пояс GMT +3, время: 03:06.