抽象工厂模式
问题描述:
这是关于抽象工厂模式。抽象工厂模式
正如我们所知,有2种方式,我们可以使用即
- 无论是创建具体的类的实例直接或
- 提供通过它我们可以访问具体类的接口
有人能说出优势/劣势,如果我使用选项1,那么这些是可能发生的问题,反之亦然,如果可能的话用实时示例。
在此先感谢...
答
如果您有一个具体的类,它不是子类,并且您确信它永远不会存在,那么您可以将其实例化为您的选项1 - 因为这不需要工厂。
如果你有几个具体的子类的接口/抽象类,并希望能够改变的实现不占用客户任何人 - 这是当你使用一个factory(或dependency injection)。
答
直接创建对象肯定是容易(在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
。
你不仅能够变化实施,但你也重用能够或份额不同消费者之间实例。
在很多情况下,您不需要抽象工厂来启用松耦合。通常情况下,您可以直接向消费者注入依赖关系,而不是诉诸额外的间接级别。
look up here http://*.com/questions/2280170/why-do-we-need-abstract-factory-design-pattern – Arseny 2010-06-11 12:16:45
抽象工厂模式的存在使您不必硬编码实例化的具体直接进入你的代码。而是委托给创建“产品”的工厂对象。所以我不确定你是什么意思的Option1。 – Gishu 2010-06-11 12:22:03