为什么Abstract Factory使用抽象类而不是接口?

时间:2013-09-17 02:12:21

标签: c# oop design-patterns abstract-factory

我正在学习设计模式,本书的第一个例子是关于抽象工厂。 我已经在VS中建立了练习并且看起来都很好,但是我怀疑有一个问题。

在本书中,工厂类的实现如下:

public abstract class AbstractVehicleFactory
{
    public abstract IBody CreateBody();
    public abstract IChassis CreateChassis();
    public abstract IGlassware CreateGlassware();
}

完成练习后,我注意到上面的课程可以用以下代码替换:

public interface IAbstractVehicleFactory
{
      IBody CreateBody();
      IChassis CreateChassis();
      IGlassware CreateGlassware();
}

当然这两个例子的功能完全相同,但我想知道使用抽象类而不是接口的原因是什么?

4 个答案:

答案 0 :(得分:7)

"abstract factory"中的

“摘要”与abstract class中的“摘要”无关。抽象工厂是混凝土工厂的“基础”,但设计模式本身并不强制执行任何特定的实施。抽象工厂可以是抽象的,甚至是具体的类,接口或某种形式的鸭型对象,具体取决于您使用的语言。

确实在C#中interface是指定抽象工厂的非常合理的方法。

答案 1 :(得分:6)

抽象类可以小心翼翼地以不间断的方式扩展;对界面的所有更改都会发生变化。

<强>更新
相反,界面可以是 in out 类型参数,而抽象类则不能。有时候一个或另一个更适合给定的设计,有时它是一个折腾。

答案 2 :(得分:4)

界面确实是最优雅的方式。

使用抽象类的参数:有时,当类维护状态并且某些部分已知时,使用抽象类会很有用。

然而,首先使用接口然后可选地实现引入此类状态的抽象类更安全。由于C#只允许单继承,因此当ConcreteFactory应该从不同的类继承时,可能会遇到麻烦。

答案 3 :(得分:3)

这可能是书中的一个错字,第一个“界面”实际上是一个抽象类。

没有“抽象界面”这样的东西。根据定义,接口是抽象的。