Есть ли преимущества использования фабрики для получения определенного объекта? [дубликат]
Осветлить определенный аспект:
Фабричный Узор. Когда следует использовать заводские методы?
В моей команде была дискуссия о шаблоне заводского проектирования.
В нашем проекте у нас есть несколько фабрик, которые построены так:
class ProductFactory {
const PRODUCT_A = 'product_a';
const PRODUCT_B = 'product_b';
const PRODUCT_C = 'product_c';
private static $classMapping = array(self::PRODUCT_A => 'A',
self::PRODUCT_B => 'B',
self::PRODUCT_C => 'C');
public function create($productConstant) {
$className = self::$classMapping[$productConstant];
return new $className();
}
}
Дискуссия шла об использовании этой фабрики. Если я никогда не определяю продукт динамически и всегда определяю продукт, который мне нравится получать от него, есть ли необходимость использовать этот шаблон?
2 answers
Преимущество фабрик в том, что они разделяют код. Возьмите свой класс Foo
, которому нужен экземпляр A
:
class Foo {
public function __construct() {
$a = new A;
}
}
Класс Foo
теперь связан с классом A
, потому что он жестко кодирует имя класса в своем источнике. Вы не можете предоставить альтернативную реализацию A
для Foo
, если хотите, например, для моделирования A
в тестах. Вот где появляются фабрики:
class Foo {
public function __construct(ProductFactory $factory) {
$a = $factory->create($factory::PRODUCT_A);
}
}
Теперь вы можете вводить любой вид A
в Foo
при необходимости, у вас есть разделил два класса.
Для этого и существуют фабрики. Используйте их, когда это необходимо. Если нет проблем с соединением Foo
с A
, вам больше энергии.
Это зависит от обстоятельств.
Шаблоны проектирования существуют для решения проблемы, а не для создания проблемы.
- Если бы вы создавали продукты внутри другого класса, фабрика могла бы предоставить макет объекта для тестирования.
- Если бы вы создавали продукты с различными типами данных для конструктора, фабрика была бы очень кстати.
- Если вы будете строго использовать внедрение зависимостей, вам не нужна фабрика
- Если для завода нет реальной причины, не используйте один.