(如果不清楚,请原谅我;我不太确定我在问什么。)
为什么 Kohana ORM 模块使用工厂方法来创建 ORM 类的实例,因为必须始终传递 factory() 想要返回的类的名称?
我对工厂模式的理解是当客户端代码事先不知道将产生的对象的(具体)类型时使用它。
Kohana 指南确实说以下都是可以接受的:
$user = ORM::factory('User');
// Or
$user = new Model_User();
但是为什么要使用第一个而不是第二个呢?
(如果不清楚,请原谅我;我不太确定我在问什么。)
为什么 Kohana ORM 模块使用工厂方法来创建 ORM 类的实例,因为必须始终传递 factory() 想要返回的类的名称?
我对工厂模式的理解是当客户端代码事先不知道将产生的对象的(具体)类型时使用它。
Kohana 指南确实说以下都是可以接受的:
$user = ORM::factory('User');
// Or
$user = new Model_User();
但是为什么要使用第一个而不是第二个呢?
@AmazonDreams提出了一个很好的观点。“用户”是该应用程序中的逻辑实体,但类名可能不会以这种方式命名。ORM 工厂方法为实例化模型提供了抽象。
您可能已经注意到,工厂方法在整个框架中使用。例如Validation::factory
, Response::factory
, View::factory
. 使用工厂模式为实例化提供抽象几乎是一种惯例。
正确答案只是“链接”。
在 PHP 5.4 中,您现在可以这样做(new Model_User)->save()
,但在过去,您必须将其作为两行单独的代码来执行。所以Model::factory('User')->save()
赢了。但是,这不再是必需的。
请注意,我没有提到 ORM。Kohana 相当多地使用这种模式。但在某些情况下,比如 ORM,工厂方法实际上需要额外的参数,这些参数会发送给构造函数。
顺便说一下,工厂方法和工厂模式是有区别的。不要混淆他们。
你为什么不做一些测试?
// Will throw an error
$users = new Model_User()->find_all();
// Correct
$users = new Model_User();
$users = $users->find_all();
// Won't throw an error and does what you want in one line
$users = ORM::factory('User')->find_all();
如果您查看工厂的代码,您会发现它并没有真正做任何特别的事情。
public static function factory($model, $id = NULL)
{
// Set class name
$model = 'Model_'.$model;
return new $model($id);
}
这在这些事情上真的很方便(愚蠢的例子,因为 Kohana 有一个内置的身份验证系统)
if(ORM::factory('User', $id)->is_enabled())
{
// Allow login
}
简而言之:
Model_
省去了每次都要写的痛苦;我个人更喜欢写作ORM::factory()
Model::factory()
做的)