工厂创建一个对象。所以,如果你想建立
class A{
public $classb;
public $classc;
public function __construct($classb, $classc)
{
$this->classb = $classb;
$this->classc = $classc;
}
}
你不想依赖每次创建对象时都必须执行以下代码
$obj = new ClassA(new ClassB, new Class C);
这就是工厂进来的地方。我们定义一个工厂来为我们照顾:
class Factory{
public function build()
{
$classc = $this->buildC();
$classb = $this->buildB();
return $this->buildA($classb, $classc);
}
public function buildA($classb, $classc)
{
return new ClassA($classb, $classc);
}
public function buildB()
{
return new ClassB;
}
public function buildC()
{
return new ClassC;
}
}
现在我们要做的就是
$factory = new Factory;
$obj = $factory->build();
真正的优势是当你想改变类。假设我们想传递一个不同的ClassC:
class Factory_New extends Factory{
public function buildC(){
return new ClassD;
}
}
或新的ClassB:
class Factory_New2 extends Factory{
public function buildB(){
return new ClassE;
}
}
现在我们可以使用继承来轻松地修改类的创建方式,放入不同的类。
一个很好的例子可能是这个用户类:
class User{
public $data;
public function __construct($data)
{
$this->data = $data;
}
}
在这个类中$ data是我们用来存储我们的数据的类。现在对于这个类,让我们说使用一个Session来存储我们的数据。工厂看起来像这样:
class Factory{
public function build()
{
$data = $this->buildData();
return $this->buildUser($data);
}
public function buildData()
{
return SessionObject();
}
public function buildUser($data)
{
return User($data);
}
}
现在,让我们说,而不是我们要将所有的数据存储在数据库中,它真的很简单的改变它:
class Factory_New extends Factory{
public function buildData()
{
return DatabaseObject();
}
}
工厂是我们用来控制我们如何将对象放在一起的设计模式,使用正确的工厂模式允许我们创建我们需要的定制对象。