Php 为什么不选择工厂模式进行分类?

Php 为什么不选择工厂模式进行分类?,php,design-patterns,Php,Design Patterns,在运行时,根据用户行为和历史,我需要执行排序操作。在我的例子中,SortByDate/SortByDemand/SortByConsumption将只返回字符串,或者我们可以说order by子句(这可能很复杂) 在大多数论坛中,我发现应该使用策略模式进行排序 我在这里附上了战略模式的图片。Util类将调用三个类之一的对象,即SortByDate/SortByDemand/SortByConsumption 因此,每次定义新的排序方法时,我都需要更改util类并定义新的策略 但是,如果我使用

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

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

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

因此,每次定义新的排序方法时,我都需要更改util类并定义新的策略

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


然而,我读到战略是满足这种需求的最佳模式。为什么战略模式在这里更好?

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

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


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

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

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


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

这两个图看起来都像策略模式,但底部的图有点模糊。如果您想要一个工厂,这意味着utilclass将是抽象的,并且有一个工厂方法,它实例化一个分类器类。utilclass的特定子类定义的特定分拣机类型


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

这两个图表看起来都像战略模式,但底部的图表有点模糊。如果您想要一个工厂,这意味着utilclass将是抽象的,并且有一个工厂方法,它实例化一个分类器类。utilclass的特定子类定义的特定分拣机类型


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

您有效地利用了工厂和战略。工厂决定创建哪种策略;该策略执行排序逻辑

您的底图很混乱,因为您从工厂继承了您的策略。工厂应该制定正确的战略


客户只是要求工厂提供策略并使用它。

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

您的底图很混乱,因为您从工厂继承了您的策略。工厂应该制定正确的战略


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

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

以下是静态结构:

以下是动态:


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

以下是静态结构:

以下是动态:


基本上,您不应该对处理策略的类提供什么类型的数据感兴趣。您只需向该类提供一些数据,并让该类实现所需的策略。在工厂模式中,您需要了解数据和处理数据的类。在战略模式中,你不需要知道任何