Подтвердить что ты не робот

Аннотация Factory, Factory Метод, построитель

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

После всего, что я прочитал, я все еще не понимаю, когда использовать абстрактный метод Factory, Factory или Builder. Я считаю, что он, наконец, погрузится после того, как я увижу простой пример проблемы, к которой лучше всего подойти, скажем, строитель, и было бы явно глупо использовать, скажем, абстрактный factory.

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

Ответ 2

Builder

// 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

// 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(); 

Аннотация Factory

// 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
...

Ответ 3

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

Factory метод:

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

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

Аннотация Factory:

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

Builder:

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

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

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

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

Шаблоны проектирования: Factory vs Factory метод vs Аннотация Factory

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

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

sourcemaking design-patterns

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

Реферат Factory особенно полезен для разработки, основанной на испытаниях и уменьшения связи.

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

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 ...
    }
}

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

Ответ 7

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

Для получения более подробной информации посетите следующий URL-адрес.

http://xeon2k.wordpress.com