使用工厂有几个主要原因:
1.抽象对象的创建
当涉及到单元测试时,这是架构中最有用的结构之一。让工厂负责实例的创建可以更容易地在测试时引入模拟。
此外,作为额外的好处,您不再与您使用的类的名称紧密耦合。
2.简化实例化
在这里,您必须考虑两个方面。首先 - 基于某些条件实例化不同对象的能力 - 在helmbert 的回答中已经很好地描述了 (+1 为他)。
另一种情况是当您实例化域对象时,这更复杂。像这样的东西:
$employees = new EmployeeCollection;
$address = new Location;
$class = $type . `Company`;
$company = new $class( $employee, $address );
在创建HoldingCompany
. 但是这整个过程可以在工厂内完成。特别是如果您的域对象工厂充分利用正确实现的 DIC(顺便说一句,这非常罕见)。
3. 在应用程序中释放对象之前准备它们
您永远不应该在构造函数中进行任何计算。无法测试该代码。构造函数应该只包含简单的变量赋值。
但这引入了一个问题:有时您需要做一些逻辑操作,然后才能让其他代码结构来处理您的实例化对象。作为初学者,我们通常在构造函数中这样做。但是现在放在哪里呢?
这就是工厂来救援的地方。
public function create( $name )
{
$instance = new $name;
if ( is_callable($instance, false, 'prepare') )
{
$instance->prepare();
}
return $instance;
}
现在,当您使用 时$factory->create('foobar')
,您的对象已完全准备好使用。