2012-04-13 2 views
2

Во время выполнения, исходя из поведения пользователя и истории, мне нужно выполнить операцию сортировки. В моем случае SortByDate/SortByDemand/SortByConsumption просто вернет строку, или мы можем сказать order by clause (что может быть сложным).Почему не заводской шаблон для сортировки?

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

enter image description here

Я приложил изображение для шаблона стратегии здесь. Класс Util будет вызывать объект одного из трех классов. I. SortByDate/SortByDemand/SortByConsumption

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

enter image description here

Если же я реализовал его, используя завод, класс Util просто нужно позвонить на завод, и он будет заботиться о каком классе позвонить. Поэтому я думаю, что я должен использовать фабрику.

Тем не менее, я прочитал, что стратегия является наилучшим примером для таких потребностей. Почему стратегия стратегии здесь лучше?

+0

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

ответ

1

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

Вот статическая структура: enter image description here

Вот динамическая:

enter image description here

+0

Удивительный пример. Но я хочу знать, могу ли я удалить SortstrategyInterface, то с какой проблемой я столкнулся бы в будущем. – chicharito

+0

Почему? Интерфейс - это то, что предоставляет Клиенту защищенные варианты сортировок. Это абстракция, которая имеет центральное значение для обоих шаблонов, поэтому ее удаление может сломать их. – Fuhrmanator

+0

Клиент просто позвонит на завод. Можете ли вы привести мне пример, если я удалю SortstrategyInterface, то что-бы это могло быть – chicharito

2

Что вы сделали, это не фабричный шаблон, а сочетание того и другого, что не ясно и, на мой взгляд, неверно.

Во втором примере имена классов являются неправильными и запутанными. SortByDateFactory не ведет себя как фабрика (она ничего не производит), но она ведет себя как стратегия. Поэтому он должен соответствовать интерфейсу стратегии.

С другой стороны, в первом примере UtilClass ведет себя как фабрика, которую вы хотите создать. Итак, я бы предложил оставить первый пример как есть, но переименуйте UtilClass в SortStrategyFactory.

+0

Я исправил имена классов. Не могли бы вы объяснить мне мой вопрос? – chicharito

1

Оба эти диаграммы выглядят как шаблон стратегии, а нижний - один. Если вы хотите фабрику, это означает, что utilclass будет абстрактным и иметь фабричный метод, который создает экземпляр класса сортировщика. Конкретный тип сортировщика, определенный конкретным подклассом utilclass.

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

+0

Hi Can You plz Объясните это, используя диаграмму классов. и что я сделал неправильно? – chicharito

0

Вы эффективно используете как завод, так и strategy. завод решает, какие стратегия для создания; стратегия выполняет логику сортировки.

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

Клиент просто запрашивает завод по стратегии и использует его.

+0

Hi Can You plz Объясните это, используя диаграмму классов. – chicharito

Смежные вопросы