Для завода не требуется использовать abstract class
. В основном это зависит от сложности объектов, которые вы хотите создать, и от того, сколько кода вы можете повторно использовать среди заводов.
Пример, на который вы ссылаетесь, несколько придуман, чтобы продемонстрировать использование абстрактного шаблона фабрики. В примере создается абстрактная фабрика («интерфейс» фабрики), которая затем расширена с помощью ShapeFactory
и ColorFactory
. Бетон ShapeFactory
возвращает значение null, когда вызывается getColor()
и наоборот. Это является нарушением single responsibility principle.
Вместо этого я предлагаю этот дизайн, чтобы показать, что вам не всегда нужна абстрактная фабрика, но можно использовать и более простой factory method pattern.
public interface Shape {
void Draw();
}
public class Square : Shape {
public void Draw() { //... }
}
public class Circle : Shape {
public void Draw() { //... }
}
public enum ShapeType {
Square,
Circle
}
public class ShapeFactory {
public Shape CreateShape(ShapeType type) {
switch (type) {
case ShapeType.Square:
return new Square();
case ShapeType.Circle:
return new Circle();
default:
throw new Exception("Unsupported ShapeType: " + type);
}
}
}
Используйте конкретные ShapeFactory так:
var factory = new ShapeFactory();
var circle = factory.CreateShape(ShapeType.Circle);
Edit: Просто придираться ... В абстрактной модели фабрики, базовый завод всегда будет абстрактным. Это связано с тем, что базовый класс (или интерфейс), который он создал, сам по себе не используется. На самом деле вы можете работать с Circle
или Square
, но не с Shape
. Это не означает, что ваш код не может иметь дело с формами в целом.
Использование интерфейса так же хорошо, как использование абстрактного класса – onof
Возможный дубликат [Почему абстрактный завод использует абстрактный класс вместо интерфейса?] (Http://stackoverflow.com/questions/18840227/why-does-abstract- factory-use-abstract-class-вместо-интерфейса) – CarbineCoder