(如果不清楚,请原谅我;我不太确定我在问什么。)
为什么Kohana ORM模块使用工厂方法来创建ORM类的实例,因为必须始终将factory()传递给想要返回的类的名称?
我对工厂模式的理解是当客户端代码事先不知道将导致的对象的(具体)类型时使用它。
Kohana guide确实说明以下内容都是可以接受的:
$user = ORM::factory('User');
// Or
$user = new Model_User();
但为什么要使用第一个呢?
答案 0 :(得分:1)
@AmazonDreams提出了一个很好的观点。 "用户"是该应用程序中的逻辑实体,但类名可能不会以这种方式命名。 ORM工厂方法为实例化模型提供抽象。
您可能已经注意到,整个框架都使用了工厂方法。例如。 Validation::factory
,Response::factory
,View::factory
。使用Factory模式为实例化提供抽象几乎是约定。
答案 1 :(得分:1)
正确的答案只是简单地链接'。
在PHP 5.4中,您现在可以执行(new Model_User)->save()
,但在过去,您必须将这两个代码行分开。所以Model::factory('User')->save()
获胜。但是,这不再是必要的。
注意我没有提到ORM。 Kohana使用了这种模式。但在某些情况下,如ORM,工厂方法实际上会获取发送给构造函数的其他参数。
顺便说一下,工厂方法和工厂模式之间存在差异。不要混淆他们。
答案 2 :(得分:0)
为什么不进行一些测试?
// 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();
如果你看一下工厂的the code,你会发现它并没有真正做任何特别的事情。
public static function factory($model, $id = NULL)
{
// Set class name
$model = 'Model_'.$model;
return new $model($id);
}
这些在这些事情上真的很方便(Kohana在auth系统中构建了一个愚蠢的例子)
if(ORM::factory('User', $id)->is_enabled())
{
// Allow login
}
简而言之:
Model_
,这样可以省去你的痛苦;我个人更喜欢写ORM::factory()
Model::factory()
为此)