3

我需要一個工廠對象能夠創建多個對象,但是在其中注入其他對象。 例如:工廠對象創建需要其他對象的對象

class MyFactory 
{ 
    public function createObjectA() { 
    return new ObjectA(new ObjectANeededObject1(), new ObjectANeededObject1()); 
    } 

    public function createObjectB() { 
    return new ObjectB(new ObjectBNeededObject1(), new ObjectBNeededObject1()); 
    } 
} 

如果我廠也實例化所需的對象(考慮到我的工廠被允許創建任何對象)?我應該通過注入傳遞給我的工廠構造函數(但構造函數將包含很多許多參數)? 我是否應該將它們作爲參數傳遞到我的工廠方法中(但工廠客戶端會知道應該如何創建該對象,而不是知道它的責任)? 我的工廠應該創建對象構建器(能夠創建我的對象及其必需的對象)而不是直接對象嗎?

你推薦什麼?

謝謝

+2

這是您開始閱讀[依賴注入容器](http://www.phptherightway.com/#containers)(DIC) –

+0

的時間。謝謝馬克。如果我理解得很好,一個容器將幫助我們創建不同的對象ObjectXNeddedObjectY。但是,如果我沒有錯,這是同樣的問題,我讀了我不應該給我的容器所有對象,而只是傳遞容器創建的對象。那麼我是否應該將所有對象ObjectXNeddedObjectY(由我的容器創建)傳遞給我的工廠? –

+0

DIC應該返回一個特定於要實例化的類的對象集合,然後工廠可以使用反射來使用集合實例化該類,例如使用諸如http://www.php.net/manual/的調用en/reflectionclass.newinstanceargs.php' –

回答

0

你的類Factory應該不知道如何從ObjectBNeededObject1類實例化一個對象,因爲如果構造的變化,你必須還回去類Factory,做必要的工作,以避免迴歸

修訂

class MyFactory 
{ 
    public static function createObjectA($object1, $object2) { 
    return new ObjectA($object1, $object2); 
    } 

    public static function createObjectB($object1, $object2) { 
    return new ObjectB($object1, $object2); 
    } 
} 

$objectA = MyFactory->createObjectA(new ObjectANeededObject1(), new ObjectANeededObject1()); 
$objectB = MyFactory->createObjectB(new ObjectANeededObject1(), new ObjectANeededObject1()); 
+0

謝謝Halayem。但我不喜歡工廠的客戶必須知道工廠需要創建哪個對象才能創建想要的對象。例如,如果客戶端是需要使用幾種「工作流步驟」工作的類Workflow,如果其中一個步驟需要例如HttpRequest對象,那麼我的工作流對象將包含能夠創建步驟的工廠和HttpRequest的。 –

+0

你的建議是沒有意義的,並且破壞了工廠的目的......「因爲如果構造函數改變了,你將會回到......」如果你考慮它,那實際上是反對讓出客戶端直接實例化具體的類。 – plalx