Фабричный метод и абстрактная фабрика

310
01 января 2019, 11:40

Помогите разобраться.

Чем отличаются данные шаблоны? Когда лучше применять первый, а когда второй?

Answer 1

Фабричный метод: есть некий класс, который выполняет свою специфическую функцию. Часть своей функциональности он делегирует внешнему интерфейсу, который инстанцируется через виртуальный метод этого класса. Наследники этого класса, перекрыв этот метод, могут вернуть другие реализации интерфейса, используемого основным алгоритмом класса.

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

Абстрактная фабрика применяется, когда требуется создать семейство интерфейсов, реализация которых должна подменяться совместно. Например, при доступе к данным есть стандартный интерфейс, отвечающий за подключение, - IDbConnection, и мой интерфейс, ответственный за преобразование объектной модели запроса в текст запроса, соответствующий стандарту определённой СУБД. Оба этих интерфейса инстанцируются одной фабрикой. В то же время, интерфейс IDbConnection объявляет метод CreateCommand, который возвращает реализацию IDbCommand для соответствующего типа подключения. Это - фабричный метод.

Answer 2

Лучше показать на примере.

class PizzaFactory {
  def get(): Pizza =  new Pizza()
}

Этот код, является самой простой реализацией фабричного метода. Т.е. есть какой то класс, в котором есть метод, создающий объекты определенного типа. В нашем случае мы создаем пиццу.

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

Разные виды пицц наследуются от общего интерфейса Pizza.

trait Pizza
class ItalianPizza extends Pizza
class HawaiiPizza extends Pizza

Сделаем для каждого вида, свой фабричный метод, с общим интерфейсом:

trait PizzaFactory {
  abstract def get(): Pizza
}
class HawaiiFactory extends PizzaFactory {
   override def get(): Pizza =  new HawaiiPizza
}
class ItalianFactory extends PizzaFactory {
  override def get(): Pizza = new ItalianPizza
}

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

Answer 3

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

Небольшая разница в том, что фабрика - это как бы много фабричных методов :) Т.е. способ создания объектов группы или иерархии каких-то классов.

Прочтите, например, здесь

READ ALSO
Как правильно создать метки в openLayers?

Как правильно создать метки в openLayers?

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

190
Как показать Preloader до загрузки iframe?

Как показать Preloader до загрузки iframe?

Можно отследить событие onload в котором удалить preloaderМожно еще добавит картинку через background

178
Переместить фигуру с помощью циклов в Javascript

Переместить фигуру с помощью циклов в Javascript

Прошу помощи с учебной задачейНе прошу писать все решение, подскажите хоть как в данной задаче в JS выразить мысль (дальше разберусь):

191
Вопрос по jQuery (js)

Вопрос по jQuery (js)

есть такой вопрос:

209