Я пытаюсь создать фабрику, которая создает классы, которые используют один и тот же базовый класс (или интерфейс), но конкретные заводы нуждаются в разных наборах параметров. Если чувствуете, что я делаю что-то неправильно, потому что эти разные Enums требуют дополнительного кода. Это можно сделать лучше?Реализации фабричных шаблонов с различными параметрами
Классы должны быть созданы:
public interface IShapeData {}
public abstract class ShapeDataWithCorners : IShapeData
{
public double Width { get; set; }
}
class Square : ShapeDataWithCorners {}
class Rectangle : ShapeDataWithCorners
{
public double Height { get; set; }
}
class Circle : IShapeData
{
public double Radius { get; set; }
}
class Oval : IShapeData
{
public double Radius1 { get; set; }
public double Radius2 { get; set; }
}
Заводы:
public enum RoundShapeTypes
{
Circle,
Oval
}
public enum CornerShapeTypes
{
Square,
Rectangle
}
public class RoundShapeDataFactory : IShapeDataFactory
{
private readonly RoundShapeTypes m_shapeType;
public RoundShapeDataFactory (RoundShapeTypes shapeType)
{
m_shapeType = shapeType;
}
public IShapeData CreateShapeData()
{
switch (m_shapeType)
{
case RoundShapeTypes.Circle:
return new Circle();
case RoundShapeTypes.Oval:
return new Oval();
}
}
}
public class CornerShapeDataFactory : IShapeDataFactory
{
private readonly CornerShapeTypes m_shapeType;
public CornerShapeDataFactory (CornerShapeTypes shapeType)
{
m_shapeType = shapeType;
}
public IShapeData CreateShapeData()
{
switch (m_shapeType)
{
case CornerShapeTypes.Square:
return new Square();
case CornerShapeTypes.Rectangle:
return new Rectangle();
}
}
}
Классы, которые называют завод:
public class RoundShapeManager
{
public IShapeData CurrentShapeData{get; set; }
public void SetShapeType (RoundShapeTypes shapeType)
{
RoundShapeDataFactory factory = new RoundShapeDataFactory (shapeType);
CurrentShapeData = factory.CreateShapeData();
}
}
public class CornerShapeManager
{
public IShapeData CurrentShapeData {get; set; }
public void SetShapeType (CornerShapeTypes shapeType)
{
CornerShapeDataFactory factory = new CornerShapeDataFactory (shapeType);
CurrentShapeData = factory.CreateShapeData();
}
}
Эти "менеджеры" являются на самом деле WPF ViewModels, которые могут изменить их представитель отображал данные во время выполнения. Для краткости я удалил конкретный код viewmodel.
Это может быть хороший вопрос для [codereview.se] – null
Я только что оставил комментарий, а не закрыл голос. Поскольку закрытое голосование за «слишком широкое», я предполагаю, что это связано с тем, что ваш вопрос открыт, что справедливо для CR, но не на SO (см. Таблицу в принятом ответе в метафоном, с которым вы связались). В том же абзаце, что и строка, которую вы цитировали: «Вместо этого проголосуйте, чтобы закрыть как слишком широкий или в основном основанный на мнениях». – null