2

减轻以下方面的特定方面:
工厂模式。什么时候使用工厂方法?

在我的团队中,有一个关于工厂设计模式的讨论。

在我们的项目中,我们有一些像这样构建的工厂:

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

讨论是关于这家工厂的用途。如果我从不动态定义产品并且总是定义我喜欢从中获得的产品,是否有必要使用这种模式?

4

2 回答 2

2

工厂的优势在于它们可以解耦代码。参加你的课程Foo,这需要一个实例A

class Foo {

    public function __construct() {
        $a = new A;
    }

}

该类Foo现在与该类耦合A,因为它在其源代码中硬编码了类名。如果您愿意,您无法提供Ato的替代实现Foo,例如A在测试中模拟。这里是工厂进来的地方:

class Foo {

    public function __construct(ProductFactory $factory) {
        $a = $factory->create($factory::PRODUCT_A);
    }

}

您现在可以在需要时注入任何类型的内容AFoo您已经解耦了这两个类。

这就是工厂的用途。在适当的时候使用它们。如果与 耦合没有问题,则为您Foo提供A更多动力。

于 2012-10-26T13:06:45.033 回答
1

这取决于。

设计模式的目的是解决问题,而不是制造问题。

  • 如果您要在另一个类中创建产品,工厂可以提供一个模拟对象进行测试。
  • 如果您要为构造函数创建具有不同类型数据的产品,工厂将派上用场。
  • 如果您要严格使用依赖注入,则不需要工厂
  • 如果工厂没有真正的理由,请不要使用。
于 2012-10-26T13:03:20.993 回答