我一直在尝试掌握 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() {
// ...
}
}
每种解决方案的优缺点是什么,哪些会被认为是“合适的”,为什么?