php - 使用工厂获取特定对象有什么优点吗?

标签 php design-patterns factory

Lighten a specific aspect of:
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();
    }
}

讨论的是关于这个工厂的使用。 如果我从不动态定义产品并且总是定义我喜欢从中接收的产品,是否需要使用此模式?

最佳答案

工厂的优点是它们可以解耦代码。以您的类 Foo 为例,它需要一个 A 实例:

class Foo {

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

}

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

class Foo {

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

}

您现在可以在需要时将任何类型的 A 注入(inject)到 Foo 中,您已经解耦了这两个类。

这就是工厂的用途。在适当的时候使用它们。如果将 FooA 耦合没有问题,那么您将拥有更多能力。

关于php - 使用工厂获取特定对象有什么优点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13087432/

相关文章:

php - copy() 函数的第二个参数不能是目录

c++ - 在 C++ 中返回新的构造函数(*this)工厂

java - 如何在工厂方法中为 Hashmap<String Boolean> 创建构造函数?

javascript - 向原型(prototype)添加方法时的范围困难

php - 用元素替换每个字符

php - strip_tags() 功能黑名单而不是白名单

php - 如何根据 Laravel 中关系的条件获取列表

c++ - 混合模板和非模板访问者方法

design-patterns - 这是一条管道,一条责任链,还是其他什么?

c# - 装饰者模式示例