抽象工厂模式

时间:2010-06-11 12:10:44

标签: design-patterns

关于抽象工厂模式。

我们知道有两种方法可以使用,即

  1. 直接创建具体类的实例或
  2. 提供一个界面,通过该界面我们可以访问具体的类
  3. 如果我使用选项1,那么有人可以说明优势/劣势,那么这些是可能发生的问题,反之亦然,如果可能的话,可以使用实时示例。

    提前致谢...

2 个答案:

答案 0 :(得分: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");
    }
}

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

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

在许多情况下,您不需要抽象工厂来启用松散耦合。通常,您可以直接将依赖项注入到使用者中,而不是诉诸于额外的间接级别。

答案 1 :(得分:0)

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

如果你有一个带有几个具体子类的接口/抽象类,并且你希望能够改变实现而不将客户端绑定到其中任何一个 - 这就是你使用factory(或{{ 3}})。