构造函数注入与setter工厂



我有一个类SearchEngine,它可以有不同的行为,因此我需要传递一个搜索策略对象。目前,我在SearchEngine中有一个setter方法,该方法由SearchStrategyFactory组成

class SearchEngine
{
protected $strategy;
public function setStrategy($type)
{
$this->strategy = app(SearchStrategyFactory::class)->create($type);
}
public function search()
{
return $this->strategy->search();
}
}

我的问题是,在方法中使用工厂类来获取对象是否是一个糟糕的设计。

我知道我应该更好地通过构造函数或作为setter方法中的参数来传递策略。

但据我所知,我正在避免使用一些嵌套的if语句。

当然,任何建议都将不胜感激。

如果简单的依赖注入是可行的替代方案,那么我不喜欢工厂方法。

更糟糕的是,您不仅在自己的SearchEngine类中使用工厂模式,而且还使用定位器模式来创建它

我认为这个代码设计不好,因为:

  • 通过使策略可变,您很难对搜索引擎使用的当前方法进行推理
  • 通过使用定位器模式,您引入了第二个依赖项。策略和容器的问题。所有这些都失去了模块性,因为构建逻辑现在部分地与您自己的SearchEngine实现绑定在一起

我建议您使用依赖项注入。使策略不可变。如果您需要策略是可变的,请使用接受策略实例的setter,而不是策略类字符串。

如果您在构建过程中注意到您有一堆分支逻辑来决定实例化;您可能没有充分利用DI的潜力。将逻辑移动到setter以消除if语句可能会引入更糟糕的错误,因为分支将发生在代码库中的任何地方,这使得对当前策略进行推理变得更加困难。

最新更新