11

我正在学习设计模式,书中的第一个例子是关于抽象工厂的。我已经在 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

4 回答 4

9

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

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

于 2013-09-17T02:49:49.080 回答
7

一个抽象类可以小心地以不间断的方式扩展;对界面的所有更改都是重大更改。

更新
相比之下,接口可以是输入输出类型参数,而抽象类不能。有时一个或另一个更适合给定的设计,有时它是一个折腾。

于 2013-09-17T02:39:45.560 回答
4

界面确实是做到这一点的最优雅的方式。

使用抽象类的一个论据:当类保持状态并且某些部分已知时,有时使用抽象类可能很有用。

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

于 2013-09-17T02:22:13.497 回答
3

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

没有“抽象接口”之类的东西。根据定义,接口是抽象的。

于 2013-09-17T02:18:29.927 回答