c# – 工厂模式,按属性选择
我有一个(不断增长的)数据生成器列表.我需要的生成器是由工厂类创建的.生成器都实现了一个通用接口,其中包括一个静态字符串名称.
我想做什么:使用上述名称的字符串参数调用factory.Create方法. create方法查找具有此名称的生成器并返回所述生成器的新实例. 我认为这样做的好处是:我只需添加新的生成器类而无需编辑工厂. 题: >这是处理这个问题的好方法吗? 最后我会像这样称呼工厂(简化): //Caller public DataModel GetData2() { var generator = new DataFactory().Create("Gen.2"); return generator.GetData(); } //Factory public class DataFactory { public AbstractDataGenerator Create(string type) { //Here the magic happens to find all implementations of IDataGenerator var allGenerators = GetImplementations(); var generator = allGenerators.FirstOrDefault(f => f.name == type); if (generator != null) return (AbstractDataGenerator)Activator.CreateInstance(generator); else return null; } } //Interface public abstract class AbstractDataGenerator { public static string name; public abstract DataModel GetData(); } //Data-Generators public class DataGen1 : AbstractDataGenerator { public static string name = "Gen.1"; public DataModel GetData() { return new DataModel("1"); } } public class DataGen2 : AbstractDataGenerator { public static string name = "Gen.2"; public DataModel GetData() { return new DataModel("2"); } } 工厂中的神奇GetImplementations()是应该通过Reflection完成还是以某种方式不同?我应该采用完全不同的方法吗? 由于答案是指IoC和DI:这个项目已经使用了NInject,所以它可以使用. 解决方法
有一个工厂来获得你需要的逻辑类的实例 – 我相信这是一个好方法.这是我自己经常使用的一种模式.关于你获得密钥的方式 – 我宁愿不把它作为静态成员(不管接口不能有静态成员),而只是作为属性并向IDataGenerator添加基类.该基类将有一个将获得名称的构造函数 – 这样你创建的每个新DataGenerator都必须设置它,你不会忘记. 关于将名称作为字符串 – 我个人更喜欢让它“强类型”.我的意思是,如果我通过Gen. 2而不是Gen.2与字符串我将只在运行时发现此问题.可能的其他方式(如果你想,因为一个简单的字符串也很好 – 一个品味问题): >用枚举替换字符串
是的,反思可能是一个很好的方法.但是,我建议您阅读依赖注入和IoC容器,例如Castle Windsor.有些东西已经为你实现了,所以为什么要重新发明轮子:) 在我看来,DI是改变生活的概念
邑.这是一个Factory
查看问题2的答案 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |