Abstract Factory Design Pattern

Ich arbeite an einem internen Projekt für mein Unternehmen. Ein Teil des Projekts besteht darin, verschiedene "Aufgaben" aus einer XML-Datei in eine Sammlung von Aufgaben zu zerlegen, die später ausgeführt werden sollen.

Da jeder Aufgabentyp eine Vielzahl von unterschiedlichen Feldern hat, habe ich beschlossen, dass es am besten ist, jeden Aufgabentyp mit einer eigenen Klasse darzustellen.

Um dies zu tun, habe ich eine abstrakte Basisklasse konstruiert:

public abstract class Task
{
    public enum TaskType
    {
        // Types of Tasks
    }   

    public abstract TaskType Type
    {
        get;
    }   

    public abstract LoadFromXml(XmlElement task);
    public abstract XmlElement CreateXml(XmlDocument currentDoc);
}

Jede Task wurde von dieser Basisklasse geerbt und enthielt den Code, der erforderlich war, um sich aus dem übergebenen XmlElement zu erstellen und sich wieder in ein XmlElement zu serialisieren.

Ein einfaches Beispiel:

public class MergeTask : Task
{

    public override TaskType Type
    {
        get { return TaskType.Merge; }
    }   

    // Lots of Properties / Methods for this Task

    public MergeTask (XmlElement elem)
    {
        this.LoadFromXml(elem);
    }

    public override LoadFromXml(XmlElement task)
    {
        // Populates this Task from the Xml.
    }

    public override XmlElement CreateXml(XmlDocument currentDoc)
    {
        // Serializes this class back to xml.
    }
}

Der Parser würde dann einen ähnlichen Code verwenden, um eine Aufgabensammlung zu erstellen:

XmlNode taskNode = parent.SelectNode("tasks");

TaskFactory tf = new TaskFactory();

foreach (XmlNode task in taskNode.ChildNodes)
{
    // Since XmlComments etc will show up
    if (task is XmlElement)
    {
        tasks.Add(tf.CreateTask(task as XmlElement));
    }
}

All dies funktioniert wunderbar und ermöglicht es mir, Aufgaben mithilfe der Basisklasse weiterzugeben, wobei die Struktur der einzelnen Klassen für jede Aufgabe beibehalten wird.

Ich bin jedoch mit meinem Code für TaskFactory.CreateTask nicht zufrieden. Diese Methode akzeptiert ein XmlElement und gibt dann eine Instanz der entsprechenden Task-Klasse zurück:

public Task CreateTask(XmlElement elem)
{
    if (elem != null)
    {
        switch(elem.Name)
        {
            case "merge":
                return new MergeTask(elem);
            default:
                throw new ArgumentException("Invalid Task");
        }
    }
}

Da ich das XMLElement analysieren muss, verwende ich einen großen Schalter (10-15 Fälle im Realcode), um die zu instanziierende untergeordnete Klasse auszuwählen. Ich hoffe, es gibt eine Art polymorphen Trick, den ich hier machen kann, um diese Methode zu bereinigen.

Irgendein Rat

Antworten auf die Frage(20)

Ihre Antwort auf die Frage