这涉及到抽象工厂模式。
我们知道有两种使用方式:
- 直接创建具体类的实例;
- 提供一个接口,通过它可以访问具体类。
请问有人能告诉我,如果我选择选项1,可能会出现哪些问题或者反之亦然?如果可能,请给出实时示例。
谢谢!
这涉及到抽象工厂模式。
我们知道有两种使用方式:
请问有人能告诉我,如果我选择选项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
的实现。
您不仅可以更改实现,还可以在不同的消费者之间重用或共享实例。
在许多情况下,您不需要抽象工厂来实现松耦合。通常,您可以直接将依赖项注入到消费者中,而无需诉诸额外的间接层。