使用工厂获得特定对象的任何优势?

时间:2012-10-26 13:02:03

标签: php design-patterns factory

  

减轻以下方面的具体方面:
  Factory Pattern. When to use factory methods?

我的团队讨论了工厂设计模式。

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

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 个答案:

答案 0 :(得分:2)

工厂的优势在于它们可以解耦代码。上课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,您已将这两个类分开。

这就是工厂的用途。适当时使用它们。如果将FooA联系起来没有问题,那么对您有更多的权力。

答案 1 :(得分:1)

这取决于。

设计模式可以解决问题,而不是产生问题。

  • 如果您要在另一个类中创建产品,工厂可以提供一个模拟对象进行测试。
  • 如果您要为构造函数创建具有不同类型数据的产品,工厂就会派上用场。
  • 如果您严格使用依赖注入,则不需要工厂
  • 如果没有真正的工厂原因,请不要使用。