Абстрактная Фабрика, Фабричный Метод, Строитель - PullRequest
32 голосов
/ 10 сентября 2010

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

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

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

Я понимаю, что это может сводиться к вопросу мнения, если пример слишком прост, но яЯ надеюсь, что если кто-нибудь может, этот человек находится в SO.

Спасибо.

Ответы [ 7 ]

53 голосов
/ 10 сентября 2010

Строитель поможет вам построить сложный объект.Примером является класс StringBuilder ( Java , C # ), который строит конечную строку по частям.Лучшим примером является UriComponentsBuilder в Spring, который помогает вам создать URI.

Заводской метод дает вам полный объект за один выстрел (в отличие от компоновщика).Базовый класс определяет один абстрактный метод, который возвращает ссылку на интерфейс (или суперкласс) и откладывает конкретное создание объекта на подклассы.

Абстрактная фабрика - это интерфейс (или абстрактный класс) для создания множестваразличные связанные объекты.Хорошим примером (в .NET) является класс DbProviderFactory, который служит для создания связанных объектов (соединений, команд, ...) с данным поставщиком базы данных (oracle, sql server, ...), в зависимости от конкретной реализации.

8 голосов
/ 10 сентября 2010

Строитель

// Builder encapsulates construction of other object. Building of the object can be done in multiple steps (methods)
public class ConfigurationBuilder
{
  // Each method adds some configuration part to internally created Configuration object
  void AddDbConfiguration(...);
  void AddSmtpConfiguration(...);
  void AddWebServicesConfiguration(...);
  void AddWebServerConfiguration(...);

  // Returns built configuration
  Configuration GetConfiguration();
}

Заводской метод

// Factory method is declared in base class or interface. Subclass defines what type is created by factory method.
public interface ICacheProvider
{
  ISession CreateCache(); // Don't have to return new instance each time - such decission is part of implementation in derived class.
}

public class InMemoryCacheProvider : ICacheProvider
{ ... }

public class DbStoredCacheProvider : ICacheProvider
{ ... }

// Client code
ICacheProvider provider = new InMemoryCacheProvider
ICache cache = provider.CreateCache(); 

Абстрактная фабрика

// Abstract factory defines families of platform classes - you don't need to specify each platform class on the client.
public interface IDbPlatform
{
  // It basically defines many factory methods for related classes
  IDbConnection CreateConnection();
  IDbCommand CreateCommand();
  ...
}

// Abstract factory implementation - single class defines whole platform
public class OraclePlatfrom : IDbPlatform
{ ... }

public class MySqlPlatform : IDbPlatform
{ ... }

// Client code:
IDbPlatform platform = new OraclePlatform();
IConnection connection = platform.CreateConnection(); // Automatically Oracle related
...
2 голосов
/ 20 февраля 2016

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

Заводской метод:

  1. Определяет интерфейс для создания объекта , но пусть подклассы решают, какой класс создать
  2. Мы создаем объект без предоставления клиенту логики создания и ссылаемся на вновь созданный объект, используя общий интерфейс (или абстрактные классы)
  3. Обеспечивает слабую связь, устраняя необходимость связывать классы приложений в коде . Код взаимодействует только с интерфейсом или абстрактным классом
  4. Может использоваться наследование или подклассификация для достижения цели

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

Абстракт Фабрика:

  1. Предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов
  2. Иерархия, которая включает в себя: много возможных"платформ" `и построение набора" продуктов "
  3. Абстрактные фабричные классы часто реализуются с помощью фабричных методов , но они также могут быть реализованы с использованием прототипа

Builder:

  1. Шаблон Builder строит сложный объект, используя простые объекты и используя пошаговый подход
  2. Замена в метод Factory / Abstract Factory в этом сценарии : слишком много аргументов для передачи из клиентской программы в класс Factory, которые могут быть подвержены ошибкам
  3. Некоторые параметры могут быть необязательными в отличие от Factory, которая заставляет отправлять все параметры

Рекомендации по шаблону проектирования Builder на Java

  1. Создание статического вложенного класса с именем Builder внутри класса, объект которого будет построен с помощью Builder
  2. Класс Builder будет иметь точно такой же набор полей , что и исходный класс
  3. Класс Builder предоставит метод для добавления ингредиентов . Каждый метод будет возвращать один и тот же объект Builder. Builder будет обогащаться при каждом вызове метода.
  4. Метод Builder.build () скопирует все значения полей компоновщика в фактический класс и возвратит объект класса Item
  5. Класс элемента (класс, для которого мы создаем Builder) должен иметь закрытый конструктор для создания своего объекта из метода build () и предотвращения доступа постороннего к его конструктору.

Похожие сообщения:

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

Удержание строителя в отдельном классе (свободный интерфейс)

Полезные ссылки:

создание источника дизайн-шаблоны

1 голос
/ 06 июля 2013

На днях я написал статью с целью сравнить шаблон Factory Method и шаблон Builder. Вы можете найти его здесь: http://www.shenghua.co.uk/factory-method-vs-builder/. Надеюсь, что он также может помочь.

Исходя из собственного опыта, я обнаружил, что книга Head First Design Pattern также является действительно хорошей книгой, в которой говорится о Design Patterns. В отличие от написанного Эрихом Гаммой, он подошел к каждому шаблону проектирования, представив проблему, вызванную тем, что шаблоны проектирования не используются, а затем подошел к тому, как шаблон проектирования может решить эту проблему. Это было очень приятное чтение для меня. Это также значительно облегчило понимание написанного Эрихом Гаммой после прочтения.

0 голосов
/ 27 ноября 2010
  • Шаблон фабричного метода - когда вы хотите построить семейство сложных объектов.
  • Шаблон построителя объектов - когда вы хотите, чтобы пользователь мог добавить свою пользовательскую реализацию в вашу среду

Пожалуйста, посетите следующий URL для более подробной информации.

http://xeon2k.wordpress.com

0 голосов
/ 10 сентября 2010

Abstract Factory особенно полезен для разработки через тестирование и уменьшения связности.

Например, в C #:

public class Worker
{
    public IConsumerFactory Factory { get; set; }

    private IResource resource;

    public DoWork()
    {
        IConsumer consumer = Factory.CreateConsumer();
        consumer.Consume(resource);
    }
}

public interface IConsumerFactory
{
    IConsumer CreateConsumer();
}

public interface IConsumer
{
    void Consume(IResource resource);
}

public class DefaultConsumerFactory : IConsumerFactory
{
    public IConsumer CreateConsumer()
    {
        return new DefaultConsumer();
    }
}

public class DefaultConsumer : IConsumer
{
    public void Consume(IResource resource)
    {
      ... Do Work ...
    }
}

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

0 голосов
/ 10 сентября 2010

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

В шаблоне Builder для создания «результата» используется подклассы - что не обязательно объектов вообще .В примере GOF есть Builder, создающий текстовый вывод (разметка или другое).

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

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

...