我一直在努力去理解面向對象的概念,雖然我的確瞭解了其中大多數概念的一般概念,但我經常發現自己需要一些關於它們實際實現的建議。其中一種情況是工廠方法。何處實施工廠方法?
我寫那將處理來自Web和命令行界面傳入的請求一個PHP應用程序,所以我想出了下面簡單的類繼承結構涵蓋這兩種類型的請求:
abstract class Request {
}
class HttpRequest extends Request {
}
class CliRequest extends Request {
}
現在我需要一個工廠方法,將返回一個具體的要求例如,根據由php_sapi_name()
返回值:
public function create() {
if(php_sapi_name() === 'cli')
return new CliRequest();
else
return new HttpRequest();
}
我的問題是:我把它放在哪裏?我能想到的至少三種可能性:
1)在一個單獨的類的靜態方法:
class RequestFactory {
public static function create() {
// ...
}
}
2)在一個單獨的類正則化方法(需要實例化類第一):
class RequestFactory {
public function create() {
// ...
}
}
3)在父類的抽象靜態方法:
abstract class Request {
public static function create() {
// ...
}
}
每種解決方案有哪些優缺點,哪些會被認爲是「正確的」,爲什麼?
選項2,其他甚至不OOP。 – 2013-04-10 15:10:10
恕我直言,'2)'是最好的一個。但是,您應該將'php_sapi_name'作爲'create'方法的參數。 – Touki 2013-04-10 16:13:17
儘管所有方法都可以正常工作,但我會推薦選項1,它不需要事先通過'new RequestFactory()'實例化工廠類。 – SaschaM78 2014-01-10 11:37:57