DI和工厂模式有什么区别?

我有一个班级取决于3个班级,其中3个班级都有他们依赖的其他班级。 目前,我正在使用一个容器类来构建所有必需的类,并将它们相互注入并返回应用程序。

容器的简化版本如下所示:

class Builder
{
    private $_options;

    public function __construct($options)
    {
        $this->_options = $options;
    }

    public function build()
    {
         $cache = $this->getCache();
         $response = $this->getResponse();
         $engine = $this->getEngine();

         return new Application($cache,$response,$engine);
    }

    public function getResponse()
    {
         $encoder = $this->getResponseEncoder();
         $cache = $this->getResponseCache();

         return new Response($encoder,$cache);
    }

    // Methods for building each object
}

我不确定这是否会被归类为FactoryMethod或DI容器。 他们似乎都以同样的方式解决同样的问题 - 他们构建对象并注入依赖关系。 这个容器有一些更复杂的构建方法,比如加载观察者并将它们附加到可观察对象上。

工厂应该做所有的建设(加载扩展等),DI容器应该使用这些工厂来注入依赖关系? 这样,子包,如Cache,Response等,都可以拥有自己专门的工厂。


DI容器绝对是一个工厂,但它是一个通用工厂。

但是,如果您通过在每次需要时为其创建依赖关系来以基于拉的方式使用它,那么您将使用Service Locator反模式。 这只是一个通用工厂,实际上与DI没有多大关系。

顾名思义,真正的依赖注入就是基于推送的 。 您可以使用构造函数注入等简单模式编写所有代码,并使用DI容器一次性解析应用程序的组合根(Root Root)中的整个依赖关系图,并将所有依赖关系注入各自的使用者。

链接地址: http://www.djcxy.com/p/77767.html

上一篇: What's the difference between DI and factory patterns?

下一篇: Benefits of IoC Containers