Architecture 为什么Kohana';我们使用工厂模式吗?

Architecture 为什么Kohana';我们使用工厂模式吗?,architecture,orm,kohana,factory-pattern,Architecture,Orm,Kohana,Factory Pattern,(如果不清楚,请原谅;我不太清楚我在问什么。) 为什么Kohana ORM模块使用factory方法来创建ORM类的实例,因为必须始终向factory()传递想要返回的类的名称 我对工厂模式的理解是,当客户机代码事先不知道将产生的对象的(具体)类型时,就使用工厂模式 报告确实指出,以下两项都是可以接受的: $user = ORM::factory('User'); // Or $user = new Model_User(); 但是为什么要在第二个上面使用第一个呢?为什么不运行一些测试呢 //

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

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

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

报告确实指出,以下两项都是可以接受的:

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

但是为什么要在第二个上面使用第一个呢?

为什么不运行一些测试呢

// 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在auth系统中构建了一个愚蠢的例子)

简言之:

  • 它允许您链接您构建的方法
  • 它省去了每次都要编写
    模型
    的痛苦;我个人更喜欢编写
    ORM::factory()
  • 其他人马上就会明白,您实例化的对象是一个ORM对象(虽然它允许您通过该工厂实例化非ORM模型,但我们有
    Model::factory()
  • 提出了一个很好的观点。“User”是该应用程序中的逻辑实体,但类名不能以这种方式命名。ORM工厂方法为实例化模型提供了抽象


    您可能已经注意到,在整个框架中使用了工厂方法。例如,
    验证::工厂
    响应::工厂
    视图::工厂
    。使用工厂模式为实例化提供抽象几乎是一种惯例。

    正确的答案只是“链接”

    在PHP5.4中,您现在可以执行
    (新模型用户)->save()
    ,但在过去,您必须将其作为两行独立的代码来执行。所以
    Model::factory('User')->save()
    wins。然而,这已不再必要

    注意,我没有提到ORM。科哈纳经常使用这种模式。但在某些情况下,比如ORM,工厂方法实际上会接受发送给构造函数的附加参数


    顺便说一下,工厂方法和工厂模式之间有区别。别把他们弄糊涂了

    你说得很对(我同意使用的方便性),但我想我真的开始使用工厂模式了——我们从来没有把ORM::factory(“东西”)称为希望得到除模型之外的任何东西。工厂是在
    模型
    之前放置
    模型
    。除此之外,工厂允许你灵活地处理你的类,当然,这些类被剥夺了,因为它们声明你是否使用工厂并不重要;如果他们改变了ORM模型的实例化方式,那么希望升级到Kohana的新版本时会遇到麻烦(看不出为什么会这样)。底线;使用工厂:)啊,谢谢,很好。那么,您是否会说ORM::factory()实际上不是工厂模式(但当然是工厂方法)?这是正确的。这是一种工厂方法。这两个概念是相关的,但有一个区别在这里得到了很好的解释
    if(ORM::factory('User', $id)->is_enabled())
    {
        // Allow login
    }