我一直在努力掌握OOP概念,虽然我确实掌握了大多数概念,但我经常发现自己需要一些关于实际实施的建议.其中一种情况是工厂方法.
我正在编写一个PHP应用程序,它将处理从Web和命令行界面传入的请求,因此我提出了以下简单的类继承结构来涵盖这两种类型的请求:
abstract class Request {
}
class HttpRequest extends Request {
}
class CliRequest extends Request {
}
Run Code Online (Sandbox Code Playgroud)
现在我需要一个工厂方法,它将返回一个具体的Request实例,具体取决于返回的值php_sapi_name():
public function create() {
if(php_sapi_name() === 'cli')
return new CliRequest();
else
return new HttpRequest();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我在哪里放?我至少可以想到三种可能性:
1)单独类中的静态方法:
class RequestFactory {
public static function create() {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
2)单独类中的常规方法(需要首先实例化该类):
class RequestFactory {
public function create() {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
3)抽象父类中的静态方法:
abstract class Request {
public static function create() {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
每个解决方案的优缺点是什么,哪些被认为是"正确的",为什么?
小智 0
在我看来,在父类中使用静态方法根本不是一个糟糕的解决方案。看一下 Java 中的 Calendar 类:有一个 getInstance 方法(实际上有很多),它根据您的区域设置和其他一些条件返回一个 Calendar 实例。