Php 为什么工厂分拣不足?

Php 为什么工厂分拣不足?,php,design-patterns,Php,Design Patterns,我在一个论坛上发现了这一点,这似乎得到了很好的解释: 策略是一种模式,旨在允许您在不破坏算法客户端的情况下向软件中添加新的案例排序算法。这是对设计复杂性的投资,如果你需要添加新的算法而不破坏你的客户,那么它将获得回报。工厂是一种补充策略的模式,因为算法实现的客户机不应该明确知道他们在软件类中使用的是哪个实现。工厂实例化算法的具体实现,以便客户机可以在不知道细节的情况下使用它们 然而,我无法理解SortStrategtyInterface的需要。我们是否应该要求工厂返回排序字符串 另外,如果有人以

我在一个论坛上发现了这一点,这似乎得到了很好的解释:

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

然而,我无法理解SortStrategtyInterface的需要。我们是否应该要求工厂返回排序字符串


另外,如果有人以上的事情是正确的,那么他们可以共享代码来调用这个吗?还有一个例子,如果我删除SortstrategyInterface,那么它会有什么缺点?

策略允许您在运行时轻松添加算法。对我来说,工厂应该足够了,但是根据理论,策略+工厂应该适合你。

虽然接口不是完全“必要”,但最好有一个接口来确保客户和不同排序算法之间的合同。该契约只是向客户机保证,无论从工厂返回哪个策略,都存在“getSortString”方法。从php5看,代码如下所示:

$sorting_obj = SortStrategyFactory::getSorterBy("demand");
if ( ! $sorting_obj instanceof SortStrategyInterface ) {
  throw new \exception('contract failed, the sorting algorithm must implement the SortStrategyInterface');
}
$sorting_obj->getSortString();

# or maybe:
try {
  $sorting_obj = (SortStrategyInterface)SortStrategyFactory::getSorterBy("date");
} catch ( \exception $e ) {
  # ...
}
$sorting_obj->getSortString();

界面从来都不是真正需要的,但它们的使用肯定有很多优点,但没有真正的缺点。保持客户端和实现之间的契约,从长远来看,扩展会变得简单得多。

再次使用策略模式是不必要的,当它的使用适合您的需要时,它只是一个很好的选择。基本思想是,对于一个公共概念排序,可以有多个实现。从上面发布的相同示例出发,该策略模式将允许您添加更多的“sort”实现,而无需更改现有客户机


假设您收到一个新的SortByser需求,这个新任务只需要使用getSortString方法实现SortStrategyInterface,以及在工厂中创建它的几行代码。从那时起,旧客户机将不会产生意外的副作用,而新的/修改过的客户机将可以使用这种新的排序策略。根据我的经验,战略模式是最常自然出现的模式。每当您的原始需求要求对一个概念采用“替代”关键字方法时,您几乎可以立即想到一种策略模式。

thanx bro:-您能帮我解释一下为什么策略模式在这里如此重要吗?太棒了,这意味着我们很多时候都在使用策略模式,而我们却不知道它:-thanx现在我知道我正在使用它战略模式