2015-10-06 109 views
1

我們必須實現能夠創建多個複雜對象的工廠。 我們應該如何處理它與依賴注入?用工廠方法處理依賴注入DP

我已經閱讀了許多有關它在stackoverflow(和其他地方)的主題,特別是馬克·塞曼的,但不能作出任何決定,所以需要你的意見。

例如:

<?php 
class EventFactory 
{ 
    public function createEvent($type) 
    { 
     switch ($type) { 
      case 'upload': 
       return new UploadEvent(new FtpUploader(), new Mailer()); 
      case 'download': 
       return new DownloadEvent(new FtpDownloader(), new Mailer()); 
      case 'save': 
       return new SaveEvent(new EventDbModel()); 
      case 'load': 
       return new LoadEvent(new EventDbModel()); 
      case 'notify': 
       return new NotifyEvent(new HttpRequester()); 
     } 
    } 
} 

我發現了一些解決方案,但不知道該選哪一個。

  1. 解決方案就像在這個例子中一樣,可以讓工廠負責實例化依賴關係。

問題:與不使用依賴注入相同的問題。

  • 另一個是給依賴於工廠的構造
  • 問題:將有大量的在構造參數和列表可以長大

    1. 我在互聯網上發現的第三種解決方案是創建一種建造者而不是事件。工廠有責任知道要創建哪種對象,並且建造者將知道如何創建它們。

    問題:構建器DP的角色是否處理依賴關係?我害怕得到與解決方案#1相同的問題。

    我們該怎麼辦?

    +0

    很多很好的問題產生一定程度的基於專家經驗的意見,但這個問題的答案將趨於幾乎完全基於意見,而不是事實,引用或專門知識。 – Epodax

    +0

    @Epodax:你自己的意見是什麼? –

    +2

    你的問題是離題。 – Epodax

    回答

    3

    我個人的時候,你要配置的建築物,但對客戶端隱藏的實現與選項去2.建築商通常使用。當你只需要傳遞參數時,工廠通常會更好。

    如果您擔心參數的數量,那麼您可以將參數對象傳遞給工廠,或者生成單個責任工廠,每個工廠都知道他們創建的事物的類型以及如何創建它,然後將它們組裝成一個要求每一個人是否可以創建所需的類型並將其傳遞,如果不能的話,或者甚至只是一個簡單的「單一類型工廠」實例列表 。

    這樣每個'工廠'只有它所需要的依賴關係,鏈只是編排可用的工廠,所以只需要依賴它們,不知道它們具有什麼依賴關係。

    不使用責任鏈更簡單。有些解決方案是這樣的:

    public class EventFactory 
    { 
        IEnumerable<ISingleTypeEventFactory> factories 
    
        public EventFactory(IEnumerable<ISingleTypeEventFactory> factories) 
        { 
         this.factories = factories; 
        } 
    
    
        public Event CreateEvent($type) 
        { 
         foreach(factory in factories) 
         { 
           if (factory.CanHandleType($type)) 
           { 
            return factory.CreateEvent($type); 
           } 
         } 
        } 
    } 
    
    +0

    不瞭解「責任鏈」部分。你能給我一個概念證明或僞代碼來說明嗎? –

    +0

    添加了更簡單選項的圖示。所有你需要做的是將所有已知的'ISingleTypeEventFactory'實現注入到這個類 –

    +0

    ps中,對於混合僞代碼抱歉。開始寫在C#語法然後意識到這是一個PHP問題,所以試圖在中間和結束更多的PHP-Y :) –