【问题标题】:Any advantages using a factory to get a particular object? [duplicate]使用工厂获取特定对象有什么好处? [复制]
【发布时间】:2012-10-26 13:02:03
【问题描述】:

减轻以下特定方面的影响:
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();
    }
}

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

【问题讨论】:

  • 您可以稍后更改产品的具体内容,而无需更改太多代码。
  • 附带说明:如果我没有完全弄错,您不会实例化 ProductFactory。因此,它需要 'create' 作为静态方法 (public static function create())。
  • @ExternalUse:请不要这样建议。谢谢!您想稍后更换工厂(例如,用于测试系统),然后静态杀死所有这些。不必要的。如果您对自己的判断是公平的,您不会建议使用全局函数,对吗?

标签: php design-patterns factory


【解决方案1】:

工厂的优势在于它们可以解耦代码。参加你的课程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 注入Foo,您已经解耦了这两个类。

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

【讨论】:

  • 如果你使用依赖注入来注入工厂,但仍然传入 $factory::PRODUCT_A 你并没有真正解耦任何东西......你只是改变了 A 实例化的方式,为此为了有效,必须有某种机制来确定需要实例化的产品。这是我的看法,有兴趣听听你的想法
  • @frosty 为什么?您可以传递一个完全不同的$factory,它在使用create($factory::PRODUCT_A) 调用时会返回一个完全不同的对象。该常量/参数不会以任何方式排除多态性。您需要做的就是继承ProductFactory 并更改private static $classMapping 中的值。
  • 是的,这是有道理的,我同意。我想您要解决的问题将决定您需要如何做事。正如您所提到的,“如果将 Foo 耦合到 A 没有问题”
  • 哦,解耦和进一步使用抽象是一个好点。老实说,如果它是合理的,我是喜欢使用这种模式的人之一。但是我还没有看到它的优点。谢谢。
【解决方案2】:

这取决于。

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

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

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 2013-08-30
    • 2012-10-09
    • 2015-11-24
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多