Design patterns 抽象工厂模式
这是关于抽象的工厂模式 我们知道有两种方法可以使用,即Design patterns 抽象工厂模式,design-patterns,Design Patterns,这是关于抽象的工厂模式 我们知道有两种方法可以使用,即 直接创建混凝土类的实例,或者 提供一个接口,通过它我们可以访问具体的类 有人能告诉我优势/劣势吗?如果我使用选项1,那么这些问题可能会发生,如果可能的话,通过实时示例,反之亦然 提前感谢…直接创建对象当然是非常容易的(C#中的示例): 虽然很容易,但它会导致紧密耦合,因为您无法独立于使用者改变实例 虽然更复杂,但使用抽象工厂的消费者是松散耦合的: public class Consumer() { private readonly
提前感谢…直接创建对象当然是非常容易的(C#中的示例): 虽然很容易,但它会导致紧密耦合,因为您无法独立于使用者改变实例 虽然更复杂,但使用抽象工厂的消费者是松散耦合的:
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
的实现
您不仅可以更改实现,还可以重用或在不同使用者之间共享实例
在许多情况下,不需要抽象工厂来启用松耦合。通常,您可以直接将依赖项注入使用者,而不是诉诸于额外的间接层次。如果您有一个具体的类,它不是子类,并且您确信它永远不会是子类,那么您可以像选项1中那样实例化它-为此,不需要工厂
如果您有一个包含多个具体子类的接口/抽象类,并且希望能够在不将客户机绑定到任何子类的情况下改变实现—这就是使用(或)时的情况。在此处查找抽象工厂模式,这样您就不必将具体的实例化直接硬编码到代码中。而是委托给创建“产品”的工厂对象。所以我不知道你说的选项1是什么意思。
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");
}
}