Зачем нам нужен абстрактный шаблон дизайна фабрики? - PullRequest
115 голосов
/ 17 февраля 2010

Большая часть определения гласит:

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

Что такое абстрактный шаблон фабрики, поскольку мы можем решить задачу, создав объект самого конкретного класса. Почему у нас есть фабричный метод, который создает объект класса Concrete?

Пожалуйста, предоставьте мне пример из реальной жизни, где я должен реализовать шаблон abstractFactory?

Ответы [ 13 ]

212 голосов
/ 17 февраля 2010

Abstract Factory - это центральный шаблон проектирования для Dependency Injection (DI). Вот список вопросов переполнения стека, где применение абстрактной фабрики было принято в качестве решения.

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

22 голосов
/ 17 февраля 2010

Реальным примером использования шаблона Abstract Factory является предоставление доступа к данным двум различным источникам данных (например, базе данных SQL и файлу XML). У вас есть два разных класса доступа к данным (шлюз к хранилищу данных). Оба наследуют от базового класса, который определяет общие методы, которые будут реализованы (например, Load, Save, Delete).

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

5 голосов
/ 17 февраля 2010

Если я правильно вас понял - вопрос в том, почему у нас есть и метод Фабрики, и абстрактные шаблоны Фабрики. Вам нужна абстрактная фабрика, когда разные полиморфные классы имеют разные процедуры создания экземпляров. И вы хотите, чтобы какой-то модуль создавал экземпляры и использовал их, не зная деталей инициализации объекта. Например - вы хотите создавать объекты Java, выполняя некоторые вычисления. Но некоторые из них являются частью приложения, в то время как байт-код другого должен считываться из БД. С другой стороны - зачем нам заводской метод? Согласитесь, эта абстрактная фабрика перекрывает это. Но в некоторых случаях - написать гораздо меньше кода, меньше классов и интерфейсов облегчает понимание системы.

3 голосов
/ 14 июня 2016

Что такое абстрактный шаблон фабрики, поскольку мы можем решить задачу путем создания объекта конкретного класса. Почему у нас есть фабричный метод, который создает объект класса Concrete?

При отсутствии Abstract Factory , Клиент должен знать детали конкретных классов. Это жесткое соединение было удалено с Abstract Factory .

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

Обратитесь к этим связанным вопросам SE для лучшего понимания:

В чем принципиальная разница между фабричными и абстрактными фабричными образцами?

Намерение:

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

Вы можете понять Цель, структура, контрольный список и практические правила из Абстрактная фабрика образец из этой статьи sourcemaking .

Контрольный список:

  1. Решите, является ли независимость от платформы и службы создания в настоящее время источником боли.
  2. Карта матрицы платформ против продуктов .
  3. Определите фабричный интерфейс , который состоит из фабричного метода для продукта.
  4. Определите фабричный производный класс для каждой платформы, который инкапсулирует все ссылки на новый оператор.
  5. клиент должен удалить все ссылки на новые и использовать фабричные методы для создания product объектов.
2 голосов
/ 17 июля 2013

Abstract Factories отлично подходят для поддержки нескольких платформ, сохраняя при этом унифицированную кодовую базу. Предположим, у вас есть большая программа на Qt или GTK + или .NET / Mono, которую вы хотите запустить в Windows, Linux и OSX. Но у вас есть функция, которая реализуется по-разному на каждой платформе (возможно, с помощью API-интерфейса kernel32 или POSIX).

public abstract class Feature
{
    public abstract int PlatformSpecificValue { get; }

    public static Feature PlatformFeature
    {
        get
        {
            string platform;
            // do platform detection here
            if (platform == "Win32")
                return new Win32Feature();
            if (platform == "POSIX")
                return new POSIXFeature();
        }
    }

    // platform overrides omitted
}

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

Feature feature = Feature.PlatformFeature;
Console.WriteLine(feature.PlatformSpecificValue);
1 голос
/ 03 декабря 2017

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

Допустим, это бренд TYPE_A, а не один класс. Допустим, существует семейство из 100 подобных классов класса A, и вам необходимо создать из них один объект. Представьте, что есть подробная информация, необходимая для того, чтобы сделать правильный объект из бренда многих похожих типов объектов, и в этом объектном объекте вы должны точно знать, какие параметры настраивать и как их настраивать.

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

И, возможно, завтра у нас будет другое семейство, скажем, type_B и type_C для создания экземпляра. Таким образом, пользовательский интерфейс будет «если еще» знать, хочет ли пользователь «type_A», «type_B» или «type_C» - но классы фабрик будут точно определять, какой класс из типа (из семейства) построить, и как его настроить - какие значения установить для его параметров или отправить его подрядчику. Все это - согласно многим параметрам, о которых пользовательский интерфейс не знает. Все это будет слишком много для одного фабричного класса.

1 голос
/ 17 февраля 2010

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

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

Это хороший пример: http://en.wikipedia.org/wiki/Abstract_factory_pattern#C.23

1 голос
/ 17 февраля 2010

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

0 голосов
/ 13 октября 2017

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

Понимание и реализация шаблона абстрактной фабрики в C #

0 голосов
/ 17 ноября 2015

Скажем, вы создаете .jar, а кто-то другой использует ваш jar и хочет использовать новый конкретный объект в вашем коде. Если вы не используете абстрактную фабрику, то она должна изменить ваш код или перезаписать ваш код. Но если вы используете абстрактную фабрику, она может предоставить фабрику и перейти к вашему коду, и все в порядке.

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

...