是关于抽象工厂模式的。
正如我们所知,我们可以使用两种方法,即
如果我使用选项1,那么这些问题可能会发生,或者反之亦然,如果可能的话,有人能告诉我优势/dis-优势吗?
提前谢谢..。
发布于 2010-06-11 12:33:19
如果您有一个没有子类的具体类,并且您确信它永远不会存在,那么您可以像在您的选项1中那样实例化它--因此不需要工厂。
如果您有一个带有几个具体子类的接口/抽象类,并且您希望能够更改实现,而不需要将客户机绑定到其中的任何一个--这就是您使用工厂 (或依赖注入)的时候。
发布于 2010-06-11 12:31:52
直接创建对象肯定是easy (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来改变Consumer的实现。
您不仅可以通过更改实现,而且还可以在不同的使用者之间重用或共享实例。
在许多情况下,您不需要抽象工厂来启用松耦合。通常,您可以直接将依赖注入到消费者,而不是诉诸于额外的间接级别。
https://stackoverflow.com/questions/3022557
复制相似问题