Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Abstract Factory use abstract class instead of interface?

I am learning about design patterns and the first example in the book is about Abstract Factory. I have built the exercise in VS and all looks good, but there is one question that I wonder about.

In the book the factory class is implemented like this:

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

After completing the exercise I have noted that the above class can be replaced with this code:

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

Of course both examples function exactly the same, but I wonder what is the reason for using an abstract class and not an interface?

like image 837
user1615362 Avatar asked Sep 17 '13 02:09

user1615362


3 Answers

"Abstract" in "abstract factory" has nothing to do with "abstract" in abstract class. Abstract factory is "base" for concrete factory, but design pattern itself does not enforce any particular implementation. Abstract factory can be abstract or even concrete class, interface or some form of duck typed object depending on language you use.

Indeed in C# interface is very reasonable way to specify Abstract Factory.

like image 111
Alexei Levenkov Avatar answered Sep 28 '22 05:09

Alexei Levenkov


An abstract class can, with care, be extended in a non-breaking manner; all changes to an interface are breaking changes.

Update:
In contrast, an interface can be an in or out type-parameter and an abstract class cannot. Sometimes one or the other is more appropriate for a given design, and sometimes it is a toss-up.

like image 24
Pieter Geerkens Avatar answered Sep 28 '22 04:09

Pieter Geerkens


An interface is indeed the most elegant way to do this.

An argument to use an abstract class: Sometimes it can be useful to use an abstract class when the class maintains a state and some parts are already known.

However it is safer to first use an interface and then optionally implement an abstract class who introduces such state. Since C# only allows single inheritance one could run into trouble when a ConcreteFactory should inherit from different classes.

like image 26
Willem Van Onsem Avatar answered Sep 28 '22 05:09

Willem Van Onsem