在运行时,根据用户行为和历史记录,我需要执行排序操作。在我的例子中,SortByDate/SortByDemand/SortByConsumption将只返回字符串,或者我们可以使用order by子句(这可能很复杂)。
在大多数论坛中,我发现应该使用策略模式进行排序。

我在这里附上了Strategy pattern的图像。Util类将调用以下三个类之一的对象,即SortByDate/SortByDemand/SortByConsumption
因此,每次定义新的排序方法时,我都需要更改util类并定义一个新的Strategy。

但是,如果我使用工厂实现它,util类只需要调用工厂,它将负责调用哪个类。所以我想我应该使用工厂。
然而,我读到该策略是满足此类需求的最佳模式。为什么策略模式在这里更好?
发布于 2012-04-14 02:37:11
策略是一种模式,旨在允许您在不破坏算法客户端的情况下向软件添加新的(在您的情况下是排序)算法。这是对设计复杂性的投资,如果你需要在不破坏客户的情况下添加新的算法,这将是值得的。工厂是一种补充策略的模式,因为算法实现的客户端不应该明确地知道它们使用的是哪个实现(就软件类而言)。工厂实例化了算法的具体实现,因此客户端可以在不知道细节的情况下使用它们。
下面是静态结构:

动态是这样的:

发布于 2012-04-13 18:33:41
您所做的不是工厂模式,而是两者的混合,这是不清楚的,在我看来,这是错误的。
在第二个示例中,类名是错误的且令人困惑。SortByDateFactory的行为不像工厂(它不生产任何东西),但它的行为确实像一种策略。因此,它应该符合策略接口。
另一方面,在第一个示例中,UtilClass的行为类似于您想要创建的工厂。因此,我建议保留第一个示例,但将UtilClass重命名为SortStrategyFactory。
发布于 2012-04-13 20:28:46
这两个图看起来都像策略模式,但底部的图有点模糊。如果你想要一个工厂,这意味着utilclass将是抽象的,并且有一个工厂方法,它实例化一个排序类。由utilclass的特定子类定义的特定类型的排序器。
策略模式的要点是避免被绑定到类层次结构中,这样您就可以将不同的排序器与各种其他功能混合和匹配。工厂适用于使用utilclass的子类,并且特定的子类(包括其所有其他功能)总是需要特定的排序器,而不是不同的排序器。根据您的需求选择合适的。
https://stackoverflow.com/questions/10139073
复制相似问题