设计不同的工厂类(以及用作工厂参数的内容!)

时间:2010-04-12 16:13:31

标签: c# design-patterns oop

假设我们有以下代码:

public class Event { }

public class SportEvent1 : Event { }
public class SportEvent2 : Event { }

public class MedicalEvent1 : Event { }
public class MedicalEvent2 : Event { }

public interface IEventFactory
{
    bool AcceptsInputString(string inputString);
    Event CreateEvent(string inputString);
}

public class EventFactory
{
    private List<IEventFactory> factories = new List<IEventFactory>();

    public void AddFactory(IEventFactory factory)
    {
        factories.Add(factory);
    }

    //I don't see a point in defining a RemoveFactory() so I won't.

    public Event CreateEvent(string inputString)
    {
        try
        {
            //iterate through all factories. If one and only one of them accepts
            //the string, generate the event. Otherwise, throw an exception.
            return factories.Single(factory => factory.AcceptsInputString(inputString)).CreateEvent(inputString);
        }
        catch (InvalidOperationException e)
        {
            throw new InvalidOperationException("Either there was no valid factory avaliable or there was more than one for the specified kind of Event.", e);
        }
    }
}

public class SportEvent1Factory : IEventFactory
{
    public bool AcceptsInputString(string inputString)
    {
        return inputString.StartsWith("SportEvent1");
    }

    public Event CreateEvent(string inputString)
    {
        return new SportEvent1();
    }
}

public class MedicalEvent1Factory : IEventFactory
{
    public bool AcceptsInputString(string inputString)
    {
        return inputString.StartsWith("MedicalEvent1");
    }

    public Event CreateEvent(string inputString)
    {
        return new MedicalEvent1();
    }
}

以下是运行它的代码:

    static void Main(string[] args)
    {
        EventFactory medicalEventFactory = new EventFactory();
        medicalEventFactory.AddFactory(new MedicalEvent1Factory());
        medicalEventFactory.AddFactory(new MedicalEvent2Factory());

        EventFactory sportsEventFactory = new EventFactory();
        sportsEventFactory.AddFactory(new SportEvent1Factory());
        sportsEventFactory.AddFactory(new SportEvent2Factory());
    }

我有几个问题:

  1. 而不是必须添加工厂 这里是我的主要方法 申请,我应该尝试 重新设计我的EventFactory课程 是一个抽象的工厂?它会 如果我有办法没有,那就更好了 手动添加 每次我想要的EventFactories 使用它们。所以我可以实例化MedicalFactory和SportsFactory。我应该建一个工厂吗?也许这会过度工程?
  2. 您可能已经注意到,我使用inputString字符串作为参数来为工厂提供信息。我有一个应用程序,允许用户创建自己的事件,但也从文本文件加载/保存它们。后来,我可能想添加其他类型的文件,XML,SQL连接等等。我能想到的唯一方法是让我能够完成这项工作的内部格式(我选择一个字符串,因为它很容易理解)。你会怎么做到的?我认为这是一个经常性的情况,可能大多数人都知道其他任何更聪明的方法。然后我只在其列表中的所有工厂的EventFactory中循环,以检查它们是否接受输入字符串。如果有,则要求它生成Event
  3. 如果您发现我正在使用的方法出现错误或尴尬,我会很高兴听到不同的实现。谢谢!

    PS:虽然我没有在这里显示它,但所有不同类型的事件都有不同的属性,所以我必须用不同的参数生成它们(SportEvent1可能有SportNameDuration属性,必须作为参数放在inputString中。

1 个答案:

答案 0 :(得分:1)

我不确定输入字符串问题,但对于第一个问题,您可能会使用“约定优于配置”;反射,IEventFActory类型和您已经拥有的命名的组合,Name.EndsWith(“EventFactory”)应该允许您实例化工厂并使用代码将它们放入列表中。

HTH,
Berryl