Есть ли преимущества использования фабрики для получения определенного объекта? [дубликат]


Осветлить определенный аспект:
Фабричный Узор. Когда следует использовать заводские методы?

В моей команде была дискуссия о шаблоне заводского проектирования.

В нашем проекте у нас есть несколько фабрик, которые построены так:

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();
    }
}

Дискуссия шла об использовании этой фабрики. Если я никогда не определяю продукт динамически и всегда определяю продукт, который мне нравится получать от него, есть ли необходимость использовать этот шаблон?

Author: Community, 2012-10-26

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, вам больше энергии.

 2
Author: deceze, 2012-10-29 14:48:38

Это зависит от обстоятельств.

Шаблоны проектирования существуют для решения проблемы, а не для создания проблемы.

  • Если бы вы создавали продукты внутри другого класса, фабрика могла бы предоставить макет объекта для тестирования.
  • Если бы вы создавали продукты с различными типами данных для конструктора, фабрика была бы очень кстати.
  • Если вы будете строго использовать внедрение зависимостей, вам не нужна фабрика
  • Если для завода нет реальной причины, не используйте один.
 1
Author: JvdBerg, 2012-10-26 13:09:10