0

(如果不清楚,请原谅我;我不太确定我在问什么。)

为什么 Kohana ORM 模块使用工厂方法来创建 ORM 类的实例,因为必须始终传递 factory() 想要返回的类的名称?

我对工厂模式的理解是当客户端代码事先不知道将产生的对象的(具体)类型时使用它。

Kohana 指南确实说以下都是可以接受的:

$user = ORM::factory('User');
// Or
$user = new Model_User();

但是为什么要使用第一个而不是第二个呢?

4

3 回答 3

1

@AmazonDreams提出了一个很好的观点。“用户”是该应用程序中的逻辑实体,但类名可能不会以这种方式命名。ORM 工厂方法为实例化模型提供了抽象。

您可能已经注意到,工厂方法在整个框架中使用。例如Validation::factory, Response::factory, View::factory. 使用工厂模式为实例化提供抽象几乎是一种惯例。

于 2013-08-15T14:32:23.437 回答
1

正确答案只是“链接”。

在 PHP 5.4 中,您现在可以这样做(new Model_User)->save(),但在过去,您必须将其作为两行单独的代码来执行。所以Model::factory('User')->save()赢了。但是,这不再是必需的。

请注意,我没有提到 ORM。Kohana 相当多地使用这种模式。但在某些情况下,比如 ORM,工厂方法实际上需要额外的参数,这些参数会发送给构造函数。

顺便说一下,工厂方法和工厂模式是有区别的。不要混淆他们。

于 2013-08-19T00:22:59.423 回答
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();

如果您查看工厂的代码,您会发现它并没有真正做任何特别的事情。

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
}

简而言之:

  1. 它允许您链接您构建的方法
  2. Model_省去了每次都要写的痛苦;我个人更喜欢写作ORM::factory()
  3. 其他人立即清楚您实例化的对象是 ORM 对象(虽然它确实允许您通过该工厂实例化非 ORM 模型,但我们有这样Model::factory()做的)
于 2013-08-14T09:40:44.507 回答