2010-04-08 92 views
1

我有一個班級取決於3個班級,其中3個班級都有其他班級。目前,我正在使用一個容器類來構建所有必需的類,並將它們相互注入並返回應用程序。DI與工廠模式有什麼區別?

容器的簡化版本看起來是這樣的:

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等,都可以擁有自己專門的工廠。

+0

可能的重複:http://stackoverflow.com/questions/557742/dependency-injection-vs-factory-pattern – 2010-04-08 09:07:48

回答

3

DI容器絕對是一個工廠,但它是一個通用工廠。

但是,如果你用它在拉基於方式通過要求它爲你打造的依賴性每次你需要他們的時候,你會採用Service Locator anti-pattern。這只是一個通用工廠,實際上與DI沒有多大關係。

真正的依賴關係注入,顧名思義,推送基於。你可以使用簡單模式編寫所有代碼,如構造函數注入,並使用DI容器一次性解析應用程序的Composition Root中的所有依賴關係圖,並將所有依賴注入到它們各自的使用者中。