Кто-нибудь может объяснить разницу между фабрикой и стратегией?
Для меня оба выглядят одинаково, кроме дополнительного фабричного класса (который создает объект продукта в фабричных моделях)
Кто-нибудь может объяснить разницу между фабрикой и стратегией?
Для меня оба выглядят одинаково, кроме дополнительного фабричного класса (который создает объект продукта в фабричных моделях)
Ответы:
Фабричный образец - это творческий образец. Модель стратегии - это операционная модель. Другими словами, фабричный шаблон используется для создания объектов определенного типа. Шаблон стратегии используется для выполнения операции (или набора операций) определенным образом. В классическом примере фабрика может создавать различные типы животных: собака, кошка, тигр, в то время как шаблон стратегии будет выполнять определенные действия, например, перемещение; используя стратегии Run, Walk или Lope.
На самом деле оба могут быть использованы вместе. Например, у вас может быть фабрика, которая создает ваши бизнес-объекты. Он может использовать разные стратегии, основанные на постоянстве среды. Если ваши данные хранятся локально в XML, он будет использовать одну стратегию. Если бы данные были удалены из другой базы данных, она использовала бы другую.
Шаблон стратегии позволяет вам полиморфно изменять поведение класса.
Заводской шаблон позволяет инкапсулировать создание объектов.
Гэри делает замечательную мысль. Если вы используете принцип кодирования абстракций, а не «конкреций», тогда многие шаблоны начинают выглядеть как вариации на тему.
Просто чтобы добавить к тому, что сказал tvanfosson, многие шаблоны выглядят так же, как и реализация. То есть, вы часто создаете интерфейс, который, возможно, не был ранее в вашем коде, а затем создаете кучу реализаций этого интерфейса. Разница в их назначении и способах их использования.
Создавайте только конкретные экземпляры. Разные аргументы могут привести к разным объектам. Это зависит от логики и т. Д.
Инкапсулируйте алгоритм (шаги) для выполнения действия. Таким образом, вы можете изменить стратегию и использовать другой алгоритм.
В то время как оба выглядят очень похожими, цель довольно различна, одна цель состоит в том, чтобы создать другую, чтобы выполнить действие.
Так. Если ваш метод 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();
}
}
Но предположим, что ваша фабрика нуждается в более продвинутом или динамичном создании. Вы можете добавить к заводскому методу стратегию и изменить ее без перекомпиляции, стратегия может измениться во время выполнения.
Прежде всего необходимо провести различие между простой фабрикой и абстрактной фабрикой. Первый - это простая фабрика, где у вас есть только один класс, который действует как фабрика для создания объекта, в то время как во втором вы подключаетесь к интерфейсу фабрики (который определяет имена методов), а затем вызываете различные фабрики, которые реализуют этот интерфейс, который должны иметь разные реализации одного и того же метода на основе некоторых критериев. Например, у нас есть интерфейс 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, возвращенный Фабрикой) :
Взгляните на эту статью в Википедии и статью о javarevisited
Шаблон стратегии:
Пример:
Вы можете настроить Стратегию скидок для конкретного товара (авиабилет или билет ShoppingCart). В этом примере вы будете предлагать 25% скидку на товар в течение июля - декабря и отсутствие скидки на товар в течение января - июня.
Похожие сообщения:
Пример шаблона стратегии в реальном мире
Шаблоны проектирования: фабрика против фабрики, метод против абстрактной фабрики
Чтобы расширить то, что сказал Оскар и со ссылкой на его код:
GetCommand - это Factory, а классы UnixCommand, WindowsCommand и OSXCommand - это стратегии.
Проще говоря, шаблон стратегии - это скорее создание поведения во время выполнения, когда вас не интересует класс реализации. С другой стороны, фабрика - это создание конкретного экземпляра класса во время выполнения, и вы можете использовать любое поведение (метод), предоставляемое реализованным интерфейсом.
Вы не можете понять разницу, просто взглянув на код или классификацию. Чтобы правильно понять шаблоны GoF, поищите их намерения:
Стратегия: «Определите семейство алгоритмов, инкапсулируйте каждый и сделайте их взаимозаменяемыми. Стратегия позволяет алгоритму отличаться независимо от клиентов, которые его используют».
Фабричный метод: «Определите интерфейс для создания объекта, но пусть подклассы решают, какой класс создать, например. Фабричный метод позволяет классу отложить создание экземпляров для подклассов».
А вот подробное объяснение намерений и различий между этими двумя шаблонами: Разница между фабричным методом и шаблонами разработки стратегии
Я могу отступить от Оскара в том смысле, что его пример реализации Фабрики довольно тесно связан и очень замкнут, неудивительно, что вы выбрали шаблон Стратегии. Реализация 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 оставляет создание объекта дочернему классу. Здесь с фабрикой вы заменяете законченный экземпляр, а не интересующее вас поведение. Таким образом вы заменяете полную систему, а не алгоритм.
Фабричный шаблон - это шаблон для создания, который создается с указанными свойствами (поведением). в то время как во время выполнения после создания вы не можете изменить его свойства (поведение). поэтому, если вам нужны другие свойства (поведение), вам нужно удалить объект и создать новый объект с необходимыми свойствами (поведением). который не гуд. в то время как в случае паттерна стратегии вы можете изменить свойства (поведение) во время выполнения.