В чем разница между фабричными и стратегическими паттернами?


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

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

12 108

12 ответов:

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

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

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

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

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

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

пример:

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

по теме:

реальный пример шаблона стратегии

шаблоны проектирования: завод против Заводского метода против абстрактного Фабрика

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

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

шаблон стратегии в простых терминах-это скорее создание поведения во время выполнения, когда вы не связаны с реализующим классом. С другой стороны, had 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 оставляет создание объекта дочернему классу. Здесь с фабрикой вы заменяете полный экземпляр, а не поведение, которое вас интересует. Этим вы будете заменять полную систему, а не алгоритм.

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

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

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

метод фабрики: "определите интерфейс для создания объекта, но пусть подклассы решают, какой класс создавать. Заводской метод позволяет класс откладывает создание экземпляра на подклассы."

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