假设我们有以下代码:
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());
}
我有几个问题:
EventFactory
课程
是一个抽象的工厂?它会
如果我有办法没有,那就更好了
手动添加
每次我想要的EventFactories
使用它们。所以我可以实例化MedicalFactory和SportsFactory。我应该建一个工厂吗?也许这会过度工程?inputString
字符串作为参数来为工厂提供信息。我有一个应用程序,允许用户创建自己的事件,但也从文本文件加载/保存它们。后来,我可能想添加其他类型的文件,XML,SQL连接等等。我能想到的唯一方法是让我能够完成这项工作的内部格式(我选择一个字符串,因为它很容易理解)。你会怎么做到的?我认为这是一个经常性的情况,可能大多数人都知道其他任何更聪明的方法。然后我只在其列表中的所有工厂的EventFactory
中循环,以检查它们是否接受输入字符串。如果有,则要求它生成Event
。如果您发现我正在使用的方法出现错误或尴尬,我会很高兴听到不同的实现。谢谢!
PS:虽然我没有在这里显示它,但所有不同类型的事件都有不同的属性,所以我必须用不同的参数生成它们(SportEvent1可能有SportName
和Duration
属性,必须作为参数放在inputString中。
答案 0 :(得分:1)
我不确定输入字符串问题,但对于第一个问题,您可能会使用“约定优于配置”;反射,IEventFActory类型和您已经拥有的命名的组合,Name.EndsWith(“EventFactory”)应该允许您实例化工厂并使用代码将它们放入列表中。
HTH,
Berryl