【发布时间】:2013-04-10 14:40:38
【问题描述】:
我一直在努力掌握 OOP 概念,虽然我确实掌握了其中大多数概念背后的一般概念,但我经常发现自己需要一些有关其实际实施的建议。工厂方法就是其中一种情况。
我正在编写一个 PHP 应用程序来处理来自 web 和命令行界面的请求,所以我想出了以下简单的类继承结构来涵盖这两种类型的请求:
abstract class Request {
}
class HttpRequest extends Request {
}
class CliRequest extends Request {
}
现在我需要一个工厂方法来返回具体的 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。
-
恕我直言,
2)是最好的。但是,您应该将php_sapi_name作为create方法的参数传递。 -
尽管所有方法都可以正常工作,但我会推荐选项 1,它不需要通过
new RequestFactory()预先实例化工厂类。