Фабрика создает объект. Итак, если вы хотите построить
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();
}
}
Фабрики - это шаблоны проектирования, которые мы используем для контроля того, как мы собираем объекты, а использование правильных фабричных шаблонов позволяет нам создавать нужные нам объекты.