为什么Kohana的ORM使用工厂模式?

时间:2013-08-14 01:12:46

标签: architecture orm kohana factory-pattern

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

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

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

Kohana guide确实说明以下内容都是可以接受的:

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

但为什么要使用第一个呢?

3 个答案:

答案 0 :(得分:1)

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

您可能已经注意到,整个框架都使用了工厂方法。例如。 Validation::factoryResponse::factoryView::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
}

简而言之:

  1. 它允许您链接您构建的方法
  2. 每次都要写Model_,这样可以省去你的痛苦;我个人更喜欢写ORM::factory()
  3. 其他人立刻清楚你实例化的对象是一个ORM对象(而 允许你通过该工厂实例化非ORM模型,但我们有Model::factory()为此)