2

在运行时,根据用户行为和历史,我需要执行排序操作。在我的情况下,SortByDate/SortByDemand/SortByConsumption将只返回字符串,或者我们可以说 order by 子句(这可能很复杂)。

在大多数论坛中,我发现应该使用策略模式进行排序。

在此处输入图像描述

我在这里附上了策略模式的图像。Util 类将调用三个类之一的对象,即 SortByDate/SortByDemand/SortByConsumption

所以每次定义新的排序方法时,我都需要更改util类并定义一个新的Strategy。

在此处输入图像描述

但是,如果我使用工厂实现它,则 util 类只需要调用工厂,它将负责调用哪个类。所以我认为我应该使用工厂。

但是,我读过该策略是满足此类需求的最佳模式。为什么策略模式在这里更好?

4

4 回答 4

2

你所做的不是工厂模式,而是两者的混合,这不清楚,在我看来是错误的。

在第二个示例中,类名错误且令人困惑。SortByDateFactory不像工厂(它不生产任何东西),但它确实像一个策略。因此,它应该符合一个策略接口。

另一方面,在第一个示例中,其UtilClass行为类似于您要创建的工厂。因此,我建议保持第一个示例不变,但将其重命名UtilClassSortStrategyFactory.

于 2012-04-13T10:33:40.543 回答
1

策略是一种模式,旨在允许您在不破坏算法客户端的情况下向您的软件添加新的(在您的情况下排序)算法。这是对设计复杂性的投资,如果您需要在不破坏客户的情况下添加新算法,它将获得回报。Factory 是一种补充 Strategy 的模式,因为算法实现的客户不应该具体知道他们正在使用哪个实现(就软件类而言)。工厂实例化算法的具体实现,因此客户端可以在不知道细节的情况下使用它们。

这是静态结构: 在此处输入图像描述

这是动态:

在此处输入图像描述

于 2012-04-13T18:37:10.647 回答
1

这两个图表看起来都像策略模式,但底部的图表有点晃动。如果你想要一个工厂,这意味着 utilclass 将是抽象的并且有一个工厂方法,它实例化一个排序器类。由 utilclass 的特定子类定义的特定类型的 sorter。

策略模式的重点是避免被绑定到类层次结构中,这样您就可以将各种排序器与各种其他特性混合和匹配。当您使用 utilclass 的子类和特定的子类(以及它的所有其余功能)将始终需要特定的排序器而不是不同的排序器时,工厂是合适的。根据您的需要选择合适的。

于 2012-04-13T12:28:45.727 回答
0

您正在有效地使用factorystrategy工厂决定创建哪种策略;该策略执行排序逻辑。

您的底部图表令人困惑,因为您从工厂继承了您的策略。工厂应该制定正确的策略。

客户只是向工厂询问策略并使用它。

于 2012-04-13T16:16:10.743 回答