Вопрос

Может ли кто-нибудь объяснить разницу между фабричными шаблонами и стратегическими?

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

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

Решение

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

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

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

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

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

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

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

  • Фабричный (методический) шаблон.

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример:

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

Связанные сообщения:

Реальный Пример Паттерна Стратегии

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

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

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

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

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

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

...

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

}

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

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

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

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

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

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

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

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