Вопрос

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

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

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

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

Спасибо.

Это было полезно?

Решение

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

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

Абстрактная фабрика - это интерфейс (или абстрактный класс), чтобы создать много разных связанных объектов. Хороший пример (в .NET) DbProviderFactory Класс, который служит для создания связанных объектов (подключений, команд, ...) к данному провайдеру баз данных (Oracle, SQL Server, ...), в зависимости от его конкретной реализации.

Другие советы

Строитель

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

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

Фабричный метод:

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

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

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

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

Строитель:

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

Руководство по проектированию строителя в Java

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

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

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

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

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

Sourcehaking шаблоны проектирования

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

Узор строителя использует подклассы для производства «вывода», который Не обязательно объекты вообще. Отказ Пример GOF имеет производителя производства текста (разметки или иначе).

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

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

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

Например, в 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 ...
    }
}

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

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

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

http://xeon2k.wordpress.com.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top