В чем разница между шаблонами Factory и Strategy?

146

Кто-нибудь может объяснить разницу между фабрикой и стратегией?

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

Sappidireddy
источник

Ответы:

227

Фабричный образец - это творческий образец. Модель стратегии - это операционная модель. Другими словами, фабричный шаблон используется для создания объектов определенного типа. Шаблон стратегии используется для выполнения операции (или набора операций) определенным образом. В классическом примере фабрика может создавать различные типы животных: собака, кошка, тигр, в то время как шаблон стратегии будет выполнять определенные действия, например, перемещение; используя стратегии Run, Walk или Lope.

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

tvanfosson
источник
1
«Шаблон стратегии - это использование для выполнения операции (или набора операций) определенным образом». Означает ли это операции над объектами?
ОПВ
32

Шаблон стратегии позволяет вам полиморфно изменять поведение класса.

Заводской шаблон позволяет инкапсулировать создание объектов.

Гэри делает замечательную мысль. Если вы используете принцип кодирования абстракций, а не «конкреций», тогда многие шаблоны начинают выглядеть как вариации на тему.

jlembke
источник
25

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

Гари Кефарт
источник
13
  • Фабричный (метод) Образец.

Создавайте только конкретные экземпляры. Разные аргументы могут привести к разным объектам. Это зависит от логики и т. Д.

  • Шаблон стратегии.

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

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

Так. Если ваш метод Factory исправлен, у вас может быть такой:

 public Command getCommand( int operatingSystem ) { 
      switch( operatingSystem ) { 
           case UNIX    :
           case LINUX   : return new UnixCommand();
           case WINDOWS : return new WindowsCommand();
           case OSX     : return new OSXCommand();
       }
  }

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

OscarRyz
источник
Я не думаю, что вы делаете правильную точку зрения здесь. Прежде всего, одна из причин этих паттернов состоит в том, чтобы избежать условных обозначений в пользу полиморфизма. Прежде всего необходимо сделать различие между простой фабрикой и абстрактной фабрикой. Первая - это простая фабрика, где у вас есть только один класс, который действует как фабрика для создания объекта, в то время как в последнем вы подключаетесь к интерфейсу и затем вызываете различные фабрики, которые реализуют этот интерфейс, которые должны иметь разные реализации одного и того же метода на основе некоторых критериев. (продолжение)
interboy
4
Именно в этом случае это приводит к некоему шаблону стратегии, но семантически отличается от него, поскольку он используется для СОЗДАНИЯ ОБЪЕКТА, а не для операций. Итак, в основном у вас есть создание объектов с использованием разных стратегий.
interboy
2
@OscarRyz Можете ли вы обновить свой ответ с помощью программы, описывающей оба
Пракаш Пандей
11

Прежде всего необходимо провести различие между простой фабрикой и абстрактной фабрикой. Первый - это простая фабрика, где у вас есть только один класс, который действует как фабрика для создания объекта, в то время как во втором вы подключаетесь к интерфейсу фабрики (который определяет имена методов), а затем вызываете различные фабрики, которые реализуют этот интерфейс, который должны иметь разные реализации одного и того же метода на основе некоторых критериев. Например, у нас есть интерфейс ButtonCreationFactory, который реализуется двумя фабриками: первой WindowsButtonCreationFactory (создает кнопки с внешним видом Windows) и второй LinuxButtonCreationFactory (создает кнопки с внешним видом Linux). Таким образом, обе эти фабрики имеют один и тот же метод создания с разными реализациями (алгоритмами).

Например, если вы хотите, чтобы кнопки с Linux выглядели и работали:

ButtonCreationFactory myFactory = new LinuxButtonCreationFactory();
Button button1 = myFactory.createButton(...);

или если вы хотите кнопки Windows

ButtonCreationFactory myFactory = new WindowsButtonCreationFactory();
Button button1 = myFactory.createButton(...);

Именно в этом случае это приводит к некоему шаблону стратегии, поскольку он дифференцирует алгоритмы для некоторого создания. Тем не менее, он отличается от него семантически, потому что он используется для СОЗДАНИЯ ОБЪЕКТА, а не для операционных алгоритмов. Таким образом, с помощью абстрактной фабрики вы создаете объект с использованием разных стратегий, что делает его очень похожим на шаблон стратегии. Тем не менее, AbstractFactory является творческим, в то время как шаблон Strategy работает. Реализация мудрая, они в результате будут одинаковыми.

interboy
источник
10

Фабрика (и FactoryMethod, возвращенный Фабрикой) :

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

Взгляните на эту статью в Википедии и статью о javarevisited

Шаблон стратегии:

  1. Это поведенческий паттерн
  2. Это основано на делегировании
  3. Это изменяет внутренности объекта, изменяя поведение метода
  4. Используется для переключения между семейством алгоритмов
  5. Изменяет поведение объекта во время выполнения

Пример:

Вы можете настроить Стратегию скидок для конкретного товара (авиабилет или билет ShoppingCart). В этом примере вы будете предлагать 25% скидку на товар в течение июля - декабря и отсутствие скидки на товар в течение января - июня.

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

Пример шаблона стратегии в реальном мире

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

Равиндра Бабу
источник
3

Чтобы расширить то, что сказал Оскар и со ссылкой на его код:

GetCommand - это Factory, а классы UnixCommand, WindowsCommand и OSXCommand - это стратегии.


источник
3

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

гурум
источник
2

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

Стратегия: «Определите семейство алгоритмов, инкапсулируйте каждый и сделайте их взаимозаменяемыми. Стратегия позволяет алгоритму отличаться независимо от клиентов, которые его используют».

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

А вот подробное объяснение намерений и различий между этими двумя шаблонами: Разница между фабричным методом и шаблонами разработки стратегии

Cristik
источник
1

Я могу отступить от Оскара в том смысле, что его пример реализации Фабрики довольно тесно связан и очень замкнут, неудивительно, что вы выбрали шаблон Стратегии. Реализация Factory не должна зависеть от какого-либо определенного числа конкретных классов, создаваемых, например:

public Command getCommand( int operatingSystem ) {        
   return commandTable.get(operatingSystem); 
}

...

public class WindowsCommand implements Command {
    ...
    static {
        CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand());
    }

}

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

Рик Б.
источник
1

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

замысел
источник
0

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

user1808932
источник