2015-04-28 4 views
3

Все примеры, которые я вижу в Абстрактные заводской шаблон Они используют абстрактный класс, чтобы дать абстракцию для заводов.
Всегда ли необходимо использовать abstract class?В абстрактных заводской шаблон основного абстрактного заводского класса, всегда ли это должен быть абстрактный класс?

С учетом обстоятельств мы с радостью можем использовать интерфейс .
Если мы используем интерфейс , это будет нарушать принцип проектирования?

Пример Я читал

Tutorials Point
oodesign

+0

Использование интерфейса так же хорошо, как использование абстрактного класса – onof

+0

Возможный дубликат [Почему абстрактный завод использует абстрактный класс вместо интерфейса?] (Http://stackoverflow.com/questions/18840227/why-does-abstract- factory-use-abstract-class-вместо-интерфейса) – CarbineCoder

ответ

1

Для завода не требуется использовать 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. Это не означает, что ваш код не может иметь дело с формами в целом.

1

Interfaces и методы их неявно abstract так это совершенно нормально использовать interface вместо abstract cass, но для того, его поддерживать абстрактный дизайн вы должны реализовать один как ...

0

1.Factory является абстрактным классом.
2.Factory может создать любой подкласс интерфейса или абстрактного класса.
3. Метод возврата фабричного метода - это интерфейс или абстрактный класс.

+1

Прошу прощения, я не понимаю ответа. Не могли бы вы рассказать? – CarbineCoder

+0

Что это значит.? – Saif

Смежные вопросы