抽象工厂模式

3

这涉及到抽象工厂模式。

我们知道有两种使用方式:

  1. 直接创建具体类的实例;
  2. 提供一个接口,通过它可以访问具体类。

请问有人能告诉我,如果我选择选项1,可能会出现哪些问题或者反之亦然?如果可能,请给出实时示例。

谢谢!


1
请查看此处:https://dev59.com/enE95IYBdhLWcg3whOLK - Arseny
抽象工厂模式的存在是为了让你不必在代码中直接硬编码具体实例化。相反,你可以委托给工厂对象来创建“产品”。所以我不确定你所说的Option1是什么意思。 - Gishu
2个回答

1

直接创建对象当然是容易的(C#示例):

public class Consumer()
{
    public void DoStuff()
    {
        var f = new Foo()
        f.DoIt("bar");
    }
}

虽然简单,但会导致紧耦合,因为您无法将实例与使用者分开。

虽然更加复杂,但使用抽象工厂的消费者是松耦合的:

public class Consumer()
{
    private readonly IFooFactory fooFactory;

    public Consumer(IFooFactory fooFactory)
    {
        if (fooFactory == null)
        {
            throw new ArgumentNullException("fooFactory");
        }

        this.fooFactory = fooFactory;
    }

    public void DoStuff()
    {
        var f = this.fooFactory.Create();
        f.DoIt("bar");
    }
}

这看起来比第一个版本复杂得多,但现在您可以独立于Consumer变化f的实现。

您不仅可以更改实现,还可以在不同的消费者之间重用共享实例。

在许多情况下,您不需要抽象工厂来实现松耦合。通常,您可以直接将依赖项注入到消费者中,而无需诉诸额外的间接层。


0

如果您有一个具体类,它没有子类,并且您确信它永远不会有子类,那么您可以像选项1中一样实例化它-这时不需要工厂。

如果您有一个带有多个具体子类的接口/抽象类,并且您想要能够在不将客户端绑定到任何一个子类的情况下变化实现-这就是使用工厂(或依赖注入)的时候。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接