探究工厂设计模式

4
这里有一篇文章:http://msdn.microsoft.com/en-us/library/Ee817667%28pandp.10%29.aspx。第一部分使用抽象类实现了该模式,第二部分则展示了一个接口类的例子。但是,这篇文章中没有讨论为什么该模式更适合使用抽象类或接口类。
那么,您会给出哪种解释(优势)?不是一般性的,而是针对这个精确的模式。
尽管接口的众所周知的好处是松耦合,但为什么它不适用于此模式呢?如果不是这样,为什么所有的微软东西都使用接口?
我对缺乏答案感到惊讶。人们似乎知道如何做事情,但并不真正知道为什么。
2个回答

1
你的想法有误。使用接口或抽象类应该是在创建实体时做出的决定。稍后,在决定构造它时,您可以使用抽象工厂模式。
他们仅仅是展示了它可以处理抽象的任意形式。接口通常被视为“更好”,因为它通过不强制构造函数并且不使用继承链接来允许松散耦合。然而,通常不会使用工厂返回接口,因为通常希望给人们注入他们自己的接口实现的能力,这不是传统上工厂模式的角色(尽管它肯定可以)。
我能想到使用接口的一个特定好处;您可以使用相同的类实现两个不同的接口。以下是一个(相当愚蠢)的例子:
interface IProvideInfo {
  string Get();
}
interface IProvideConnectionString : IProvideInfo { }
interface IProvideCurrentUserName : IProvideInfo { }

class CurrentContextProvider : IProvideConnectionString, IProvideCurrentUserName  {
  string IProvideConnectionString.Get() {
    return ConfigurationManager.ConnectionStrings["db"];
  }
  string IProvideCurrentUserName.Get() {
    return _currentUserName;
  }
  string _currentUserName;
  public string SetCurrentUserName(string s) {
    _currerntUserName = s;
  }
}

public class InfoProviderFactory {
  CurrentContextProvider _provider = new CurrentContextProvider()
  public IProvideInfo GetProvider(string key) {
    return _provider;
  }
}

接口的众所周知的好处是松耦合,那么为什么这个模式不适用呢?如果不是这样,为什么微软的所有东西都使用接口呢? - user310291
如果你想从微软寻找最佳实践,那么你可能不是在正确的地方寻找。他们的一些东西还不错(来自模式和实践、ASP.Net MVC的指导),大多数都是为了适应各种遗留问题而进行的缓慢演进。抽象类的优点在于它支持模板模式,这通常是与工厂一起使用的。通常情况下,使用接口可以在运行时注入替代实现,而传统的工厂模式不支持这种方式。 - George Mauer

1

如果你仔细想一下,抽象基类就像是一个带有部分实现的接口。因此,如果你有一些标准功能将被所有由工厂创建的类共享,那么请使用抽象基类。如果你没有任何实现,只需使用接口。


一个抽象基类也会强制要求构造函数并占用你的继承链。它绝对不同于带有部分实现的接口! - George Mauer
实际上,在工厂模式的上下文中是这样的。实现至少需要一个默认构造函数。我的观点是,您可以在工厂模式中使用抽象基类或接口,并且当您想要一些基本实现时,您将使用抽象基类。 - Tom Cabanski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接