我一直在努力去理解面向对象的概念,虽然我的确了解了其中大多数概念的一般概念,但我经常发现自己需要一些关于它们实际实现的建议。其中一种情况是工厂方法。何处实施工厂方法?
我写那将处理来自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