Шаблоны проектирования: Фабрика против фабрики метод против абстрактной фабрики

Я читал шаблонов проектирования с веб-сайта

Там я прочитал о Фабрика, фабричный метод и абстрактная фабрика, но они настолько запутано, не понятно по определению. По данным определений

Фабрика - создает объекты, не подвергая логику экземпляра клиенту и ссылается на вновь созданный объект через общий интерфейс. Это упрощенная версия метода фабрики

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

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

Я также посмотрел на другие сайте StackOverflow нити относительно абстрактная Фабрика против метод фабрики, но UML диаграмм тянет туда сделать моем понимании еще хуже.

Может кто-нибудь пожалуйста, скажите мне

  1. Как эти три модели отличаются друг от друга?
  2. Когда какую использовать?
  3. А также, если возможно, какие-то примеры на Java, связанные с этими картинами?
Комментарии к вопросу (1)

Все три типа фабрика делает то же самое: они являются "умные конструктора и".

Позвольте'говорят, что вы хотите, чтобы иметь возможность создать два вида фруктов: яблоко и апельсин.

<Н3>Фабрика</Н3> Завод является "фиксированный", в том, что у вас есть только одна реализация без создания подклассов. В этом случае, вы будете иметь класс такой:

class FruitFactory {

  public Apple makeApple() {
    // Code for creating an Apple here.
  }

  public Orange makeOrange() {
    // Code for creating an orange here.
  }

}

Пример: построение яблоко или апельсин-это слишком сложный для обработки в конструкторе либо.

<Н3>метод фабрики</Н3> Фабричный метод обычно используется, когда у вас есть некоторые универсальные обработки в классе, но хотите отличаться, какой плод вы на самом деле использовать. Так:

abstract class FruitPicker {

  protected abstract Fruit makeFruit();

  public void pickFruit() {
    private final Fruit f = makeFruit(); // The fruit we will work on..

  }
}

...затем вы можете повторно использовать общие функциональные возможности в FruitPicker.pickFruit () путем реализации фабричного метода в подклассах:

class OrangePicker extends FruitPicker {

  @Override
  protected Fruit makeFruit() {
    return new Orange();
  }
}

<Н3>абстрактная Фабрика</Н3> Абстрактная фабрика является, как правило, используется для таких вещей, как зависимость/стратегии инъекции, когда вы хотите, чтобы иметь возможность создать целое семейство предметов, которые должны быть на "такой же", и есть некоторые общие базовые классы. Здесь'ы смутно фруктов, например. Дело здесь заключается в том, что мы хотим убедиться, что мы не'т случайно использовать OrangePicker на яблоко. Как долго мы сможем получить наши фрукты и выбора из той же фабрики, они будут совпадать.

interface PlantFactory {

  Plant makePlant();

  Picker makePicker(); 

}

public class AppleFactory implements PlantFactory {
  Plant makePlant() {
    return new Apple();
  }

  Picker makePicker() {
    return new ApplePicker();
  }
}

public class OrangeFactory implements PlantFactory {
  Plant makePlant() {
    return new Orange();
  }

  Picker makePicker() {
    return new OrangePicker();
  }
}
Комментарии (2)
  1. Как эти три модели отличаются друг от друга?

Фабрика: создает объекты, не подвергая логику экземпляра клиенту.

Способ завода: определить интерфейс для создания объекта, но давайте подклассы решить, какой класс инстанцировать. Фабричный метод позволяет классу отложить инстанцирование подклассам

Абстрактная Фабрика: предоставляет интерфейс для создания семьи, связанные или зависимые объекты без указания их конкретных классов.

AbstractFactory шаблон использует состав, чтобы делегировать ответственность за создание объекта другого класса, в то время как метод фабрики дизайн шаблона использует наследование и опирается на производный класс или вспомогательный класс для создания объекта

  1. Когда какую использовать?

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

Фабричный метод: клиент не'т знаю, что классы бетона необходимо создать во время выполнения, но просто хочет сделать класс, который будет делать эту работу.

AbstactFactory: если в вашей системе есть создать несколько семейств продуктов или вы хотите, чтобы обеспечить библиотеку продуктов, не подвергая детали реализации.

Абстрактные классы Фабрика часто реализуется с помощью метода фабрики. Фабричные методы обычно называют методами в шаблон.

  1. А также, если возможно, какие-то примеры на Java, связанные с этими картинами?

Фабрики и FactoryMethod

Цель:

Определить интерфейс для создания объекта, но давайте подклассы решить, какой класс инстанцировать. Заводской метод позволяет классу отложить инстанцирование для суб-классов.

UML-схемы:

Продукт: он определяет интерфейс объектов фабричный метод создает.

ConcreteProduct: продукт реализует интерфейс

Создатель: объявляет фабричный метод

ConcreateCreator: реализует метод фабрики, чтобы возвратить экземпляр ConcreteProduct

Постановка задачи: создать фабрику игр с помощью методов фабрики, который определяет интерфейс игры.

Фрагмент кода:

https://stackoverflow.com/questions/69849/factory-pattern-when-to-use-factory-methods/35857241#35857241

Сравнение с другими креационистскими моделей:

  1. Проектирование начинают с помощью фабричный метод (менее сложная, более настраиваемый, подклассы размножаться) и развиваться в направлении абстрактная Фабрика, прототип, или строителя (более гибкая, более сложные), как конструктор узнает, где более гибкого

  2. Абстрактная Фабрика занятия чаще всего реализуется с методы фабрики, но они также могут быть реализованы с использованием прототип

Литература для дополнительного чтения: дизайн-моделей Sourcemaking

Комментарии (1)

Завод - отдельный класс фабрики для создания сложных объектов.

Например, класс FruitFactory для создания объекта фруктов

class FruitFactory{

public static Fruit getFruit(){...}

}

Фабричный метод - а не целый отдельный класс для фабрики, просто добавить один метод в этом классе себя как фабрика.

Экс:

Calendar.getInstance() (Java's Calendar)

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

Пример: Допустим, мы хотим построить завод по компьютерной части. Итак, существует несколько типов компьютеров, как Ноутбук, Настольный компьютер, сервер.

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

ComputerTypeAbstractFactory.getComputerPartFactory(String computerType) ---> This will return PartFactory which can be one of these ServerPartFactory, LaptopPartFactory, DesktopPartFactory.

Теперь эти 3 себя снова заводы. (Вы будете иметь дело с самим PartFactory, но под капотом, там будет отдельная реализация на основе того, что вы предоставили в абстрактная фабрика)

  Interface-> PartFactory. getComputerPart(String s), 
Implementations -> ServerPartFactory, LaptopPartFactory, DesktopPartFactory.

Usage:
new ComputerTypeAbstractFactory().getFactory(“Laptop”).getComputerPart(“RAM”)

Редактировать: Редактировать, чтобы обеспечить точные интерфейсы для абстрактной фабрики согласно возражений в комментариях.

Комментарии (4)

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

Шаблон фабрика создает объекты на основе критериев ввода, таким образом, гарантируя, что вы не должны писать код, как если после этого создать такой объект, то этот объект как бы. Хорошим примером этого является сайт о путешествиях. Туристический сайт может обеспечить только проезд (самолет, поезд, автобус) или / и предоставить отели или / и предоставить туристические пакеты притяжения. Теперь, когда пользователь выбирает следующий, веб-сайт должен решать, какие объекты он должен создать. Оно должно только создавать путешествий или гостинице тоже объект.

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

Обе фабрики'ы не имеют ничего общего друг с другом, поэтому хороший дизайн, чтобы держать их в разные фабрика'ы.

Надеюсь, это теперь понятно. Изучаю сайт снова держа этот пример в уме, надеюсь, это поможет. И я очень надеюсь, что я правильно представляла модели :).

Комментарии (0)
AbstractProductA, A1 and A2 both implementing the AbstractProductA
AbstractProductB, B1 and B2 both implementing the AbstractProductB

interface Factory {
    AbstractProductA getProductA(); //Factory Method - generate A1/A2
}

Используя метод фабрики, пользователь может создавать А1 или А2 AbstractProductA.

interface AbstractFactory {
    AbstractProductA getProductA(); //Factory Method
    AbstractProductB getProductB(); //Factory Method
}

Но абстрактная Фабрика, имеющая более 1 фабричный метод ( например: 2 методы фабрики), используя те методы фабрики будет создан набор объектов,/ связанные объекты. Используя абстрактную фабрику, пользователь может создавать А1, Б1 объектов AbstractProductA, AbstractProductB

Комментарии (0)

За этот ответ, я имею в "банда четырех" в Книгу.

Нет нет на "фабрике" и не "по-простому фабрики и" не то "виртуальная фабрика" и определения в книге. Обычно когда люди говорят о том, что "Фабрика" по шаблону, они могут говорить о то, что создает конкретный объект из класса (но не в "Строитель" по образцу); они может или не может обратитесь в "Метод фабрики" или "абстрактная Фабрика" и узоров. Любой человек может реализовать на "фабрике" и как он выиграл't, потому что это's не формальный термин (имейте в виду, что некоторые люди\компании\общин могут иметь собственный словарный запас).

Книга только содержит определения "и абстрактным Фабрика" и "фабричный метод и".

Вот несколько определений из книги и краткое объяснение, почему оба они могут быть настолько запутанной. Я опускаю примеры кода, потому что вы можете найти их в других ответов:

Метод фабрики (Гоф): определить интерфейс для создания объекта, но давайте подклассы решить, какой класс инстанцировать. Заводской метод позволяет классу отложить инстанцирование подклассам.

Абстрактная Фабрика (Гоф): предоставляет интерфейс для создания семьи, связанные или зависимые объекты без указания их конкретных классов.

Источником путаницы: часто можно назвать класс, который используется в "Метод фабрики" и рисунок как "фабрики и quot.; Этот класс является абстрактным по определению. Что's, почему оно легко назвать этот класс "и абстрактным Фабрика" по. Но это's просто имя класса; вы должны'т путать с "абстрактная Фабрика" по шаблону (имя класса != название рисунка). В "абстрактная Фабрика" и картина иная - это **** не использовать абстрактный класс; он определяет интерфейс (не обязательно язык программирования, интерфейс) для создания части более крупного объекта или объектов, которые связаны друг с другом, или он должен быть создан определенным образом.

Комментарии (0)

Никто не цитирует оригинальной книги шаблоны проектирования: элементы объектно-ориентированного многоразовые Software, которая дает ответа в первых двух пунктах раздела “Обсуждение порождающих паттернов” (выделено мной):

существует два распространенных способа параметризации системы классов объектов, который он создает. Одним из способов является подкласс класс, который создает объекты; это соответствует данным, используя метод фабрики (107) образец. Главный недостаток такого подхода заключается в том, что он может потребовать новый подкласс просто сменить класс продукта. Такие изменения могут каскаде. Например, когда создатель продукта сама по себе создана заводским способом, то вы должны переопределить как и его создатель.

другой способ для параметризации системы больше полагается на объект состав: определить объект, который отвечает за знание класса объектов продукта, и сделать его параметров системы. Это является ключевым аспектом абстрактная Фабрика (87), Строитель (97) и прототипа (117) узоры. Все три предполагают создание нового объекта “фабрика”, чьей обязанностью является создание объектов товар. Абстрактная фабрика фабрика объектов, производящих объекты нескольких классов. Застройщик объекта здание завода сложный продукт постепенно, используя соответственно сложный протокол. Прототип имеет заводской объект строительства продукт путем копирования объекта прототипа. В этом случае объект фабрики и прототип один и тот же объект, потому что прототип отвечает за возврат товара.

Комментарии (0)