В чем разница между фабрикой и стратегией? - PullRequest
123 голосов
/ 06 марта 2009

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

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

Ответы [ 12 ]

186 голосов
/ 06 марта 2009

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

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

24 голосов
/ 06 марта 2009

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

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

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

19 голосов
/ 06 марта 2009

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

10 голосов
/ 06 марта 2009
  • Шаблон фабрики (метода).

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

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

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

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

Итак. Если ваш метод 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();
       }
  }

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

9 голосов
/ 28 января 2013

Прежде всего необходимо сделать различие между простой фабрикой и абстрактной фабрикой. Первый - это простая фабрика, где у вас есть только один класс, который действует как фабрика для создания объекта, а во втором вы подключаетесь к интерфейсу фабрики (который определяет имена методов), а затем вызываете различные фабрики, которые реализуют этот интерфейс, который должны иметь различные реализации одного и того же метода на основе некоторых критериев. Например, у нас есть интерфейс 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 работает. Реализация мудрая, они в результате будут одинаковыми.

7 голосов
/ 10 февраля 2016

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

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

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

Схема стратегии:

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

Пример:

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

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

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

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

3 голосов
/ 19 ноября 2014

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

2 голосов
/ 14 мая 2009

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

getCommand является фабрикой, а классы UnixCommand, WindowsCommand и OSXCommand являются стратегиями

1 голос
/ 28 октября 2013

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

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

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

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

1 голос
/ 11 февраля 2012

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

...