Ich versuche, eine Fabrik zu machen, die Klassen erstellt, die die gleiche Basisklasse (oder Schnittstelle) verwenden, aber die Betonfabriken benötigen unterschiedliche Parametersätze. Wenn ich das Gefühl habe, dass ich etwas falsch mache, da diese verschiedenen Enums zusätzlichen Code erfordern. Könnte das besser gemacht werden?Factory-Muster-Implementierungen mit verschiedenen Parametern
Klassen erstellt werden:
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; }
}
Fabriken:
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();
}
}
}
Klassen, die das Werk nennen:
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();
}
}
Diese "Manager" sind tatsächlich WPF Viewmodels, die ändern können ihr Vertreter zeigte Daten zur Laufzeit an. Ich habe den Viewmodel-spezifischen Code der Kürze halber entfernt.
Dies könnte eine gute Frage für [codereview.se] – null
Ich habe nur den Kommentar, nicht die enge Abstimmung verlassen. Da die Schlussabstimmung für "zu breit" ist, liegt das wahrscheinlich daran, dass Ihre Frage offen ist, was für CR gilt, aber nicht für SO (siehe die Tabelle in der akzeptierten Antwort in der Metafrage, mit der Sie verbunden sind). Im selben Absatz wie die von Ihnen zitierte Zeile: "* Stimmen Sie stattdessen ab, um zu weit oder überwiegend auf Meinung zu schließen. *" – null