关于抽象工厂模式。
我们知道有两种方法可以使用,即
如果我使用选项1,那么有人可以说明优势/劣势,那么这些是可能发生的问题,反之亦然,如果可能的话,可以使用实时示例。
提前致谢...
答案 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}})。