我想爲我們的系統設計一組工廠類,其中工廠創建的一些對象也需要在它們可以正確使用之前被初始化。工廠類與對象初始化 - 試圖避免靜態
實施例:
$foobar = new Foobar();
$foobar->init($qux, ...);
// $foobar ready for usage
對於相同的例子,讓我們說,$qux
對象是唯一的相依性,Foobar
需求。我想獲得的是:
$foobar = Foo_Factory('bar');
爲了避免需要沿着$qux
對象傳遞在整個系統中,並把它傳遞給工廠類作爲另一個參數,我想執行直接在工廠類的初始化Foobar
:
class Foo_Factory {
public static function getFoo($type) {
// some processing here
$foo_name = 'Foo' . $type;
$foo = new $foo_name();
$foo->init($qux);
return $foo;
}
}
有浮現在腦海中幾個解決方案,但他們都不是很理想:
- 添加靜態二傳手甲基od爲
$qux
添加到工廠類中,並讓它將對$qux
的引用存儲在私有靜態變量中。系統可以在開始時設置$qux
,並且工廠類可以阻止任何未來更改(出於安全原因)。
儘管這種方法有效,但在單元測試期間使用靜態參數來存儲對參考的參考是有問題的(例如,由於其靜態狀態,它在單個測試之間愉快地生存下來)。 - 使用Singleton模式創建一個新的上下文類,並讓工廠類使用它來獲取對
$qux
的引用。這可能比選項#1更清潔一些(儘管我們將靜態問題從工廠類移至上下文類)。 - 一直使用依賴注入,即將
$qux
傳遞給使用工廠類的任何對象,並讓該對象作爲另一個參數傳遞給工廠類:Foo_Factory::getFoo($type, $qux);
。 - 與上面(#3)相同,但不是沿着系統傳遞
$qux
,而是傳遞工廠類的實例(即在這種情況下,它不會是靜態的,而是可實例化的)。
請問您有什麼建議?上述四種替代方法中的任何一種,還是有更好的方法可以做到這一點?
注:我不想在這裏進入一個static is evil
flamewar,只是試圖想出最好的解決方案。
啊,那是非常酷其實 - 我知道我將不得不考慮交響樂團更詳細(實際)當我得到一個機會。我創建了一個簡單的容器解決方案,雖然我仍然在內部使用工廠,但它的作用就像一個魅力:-)感謝您的反饋和示例! – MicE 2011-04-06 01:35:13