# Factory паттерн в Javascript

poster
В этом уроке мы с вами разберем такой паттерн, как Factory, или по русски фабрика. Основная идея в том, что мы создаем фабрику, которая может создавать нам обьекты.
Понравилось? Поделитесь с друзьями!
Понравилось?
Поделитесь с друзьями!
Комментарии
Текст видео

В этом уроке мы с вами разберем такой паттерн, как Factory, или по русски фабрика. Основная идея в том, что мы создаем фабрику, которая может создавать нам обьекты.

И сразу же возникает вопрос, а почему мы не можем просто использовать оператор new, чтобы создавать обьекты? Есть ситуации, когда мы хотим скрыть снаружи реализацию создания обьекта и в этом случае нам поможет паттерн Factory.

Давайте разберем на простом примере. Давайте создадим с вами фабрику Employee у которой будет метод create.

class Employee {
  create (type) {
    let employee
    if (type === 'fulltime') {
      employee = new FullTime()
    } else if (type === 'parttime') {
      employee = new PartTime()
    } else if (type === 'temporary') {
      employee = new Temporary()
    } else if (type === 'contractor') {
      employee = new Contractor()
    }
    employee.type = type
    employee.say = function () {
      console.log(`${this.type}: rate ${this.rate}/hour`)
    }
  }
}

В методе create мы создаем по типу разные экземпляры класса, таким образом скрывая от конечного пользователя экземпляры какого класса мы используем.

На выходе мы получаем только обьект с нужными полями и методом say.

Теперь нам нужно создать недостающие классы.

class Fulltime {
  constructor () {
    this.rate = '$12'
  }
}

class PartTime {
  constructor () {
    this.rate = '$11'
  }
}

class Temporary {
  constructor () {
    this.rate = '$10'
  }
}

class Contractor {
  constructor () {
    this.rate = '$15'
  }
}

Эти классы имеют в конструкторе только рейт в час.

Теперь давайте вызовем нашу фабрику

const factory = new Employee()
fulltime = factory.create('fulltime')
parttime = factory.create('parttime')
temporary = factory.create('temporary')
contractor = factory.create('contractor')

fulltime.say()
parttime.say()
temporary.say()
contractor.say()

Если мы посмотрим в браузер, то все работает.

Фабрику стоит использовать, если в конструкторе у вас очень высокая сложность создания обьекта, чаще всего, когда он может создаваться из нескольких источников. Также она отлично подходит, когда вам нужно создавать много обьектов с одинаковыми полями. Но также, она может создать дополнительную сложность в приложении там, где ее можно было бы избежать.

Если у вас возникли какие-то вопросы или комментарии, пишите их прямо под этим видео.

Только зарегистрированные пользователи могут оставлять комментарии.  Войдите, пожалуйста.
Андрей Александрович
4 месяцев назад
в функции `create` не хватает `return employee` :)
Webs k
1год назад назад
Как мне кажется не очень удачный пример, нарушает принципы SOLID
monsterlessons
1год назад назад
Это стандартный пример из книжки по паттернам javascript.
Артур Владимирович
1год назад назад
Я тоже подумал про switch case, но это дело вкуса=) Спасибо за цикл статей про паттерны, давно хотел в них разобраться. Тут все кратко и по делу. П.С. В предпоследнем предложение написано 'создадить', если бы был текст на гитхабе, я бы отправил пулл реквест на исправление:)
monsterlessons
1год назад назад
Спасибо, исправил. Идея насчет гитхаба интересная - подумаю как бы такое реализовать.
Иван Древаль
1год назад назад
Буть мужиком! Используй switch...case!!! А по теме - спасибо. Кстати было бы интересно посмотреть на какой-то более "живой пример". Я так понимаю фабрики вообще часто используют.
monsterlessons
1год назад назад
Все используют по мере надобности. На мой взгляд - этот пример достаточно живой. На проекте, который я недавно видел идет 10 типов постов и одна фабрика, куда просто бросается обьект с type и id и на выходе мы получаем обьект нужного типа с нужными методами и данными.