c# – 将满足开/关原则的工厂模式?
发布时间:2020-12-15 03:55:16 所属栏目:百科 来源:网络整理
导读:我有以下具体的动物产品:狗和猫. 我正在使用parameterized Factory method创建所述产品.根据传递给Factory方法的AnimalInfo参数,将创建一个具体的产品.映射逻辑放在Factory方法中. 这是我的代码: public abstract class AnimalInfo { public abstract Stri
我有以下具体的动物产品:狗和猫.
我正在使用parameterized Factory method创建所述产品.根据传递给Factory方法的AnimalInfo参数,将创建一个具体的产品.映射逻辑放在Factory方法中. 这是我的代码: public abstract class AnimalInfo { public abstract String Sound { get; } } public class DogInfo : AnimalInfo { public override string Sound { get { return "Bark"; } } } public class CatInfo : AnimalInfo { public override string Sound { get { return "Meow"; } } } public abstract class Animal { public abstract void Talk(); } public class Dog : Animal { private readonly DogInfo _info; public Dog(DogInfo aInfo) { _info = aInfo; } public override void Talk() { Console.WriteLine(_info.Sound); } } public class Cat : Animal { private readonly CatInfo _info; public Cat(CatInfo aInfo) { _info = aInfo; } public override void Talk() { Console.WriteLine(_info.Sound); } } 这是我的Factory方法及其逻辑: public static class AnimalFactory { public static Animal CreateAnimal(AnimalInfo aInfo) { if (aInfo is DogInfo) return new Dog(aInfo as DogInfo); if (aInfo is CatInfo) return new Cat(aInfo as CatInfo); return null; } } 我在这里看到的问题是,Factory方法本身违反了Open/Closed principle,如果我添加一个新的Animal,我将需要修改Factory方法来反映新的映射. 有没有办法通过反思使创作更加“动态”?更重要的是,我的设计有没有反模式? 解决方法
简单的出路是使AnimalInfo本身成为工厂:
public abstract class AnimalInfo<T> where T: Animal { public abstract String Sound { get; } public abstract T CreateAnimal(); } DogInfo的实现: public class DogInfo : AnimalInfo<Dog> { public override string Sound { get { return "Bark"; } } public override Dog CreateAnimal() { return new Dog(this); } } 您可以保留当前的静态工厂,如果您想: public static class AnimalFactory { public static Animal CreateAnimal(AnimalInfo aInfo) { return aInfo.CreateAnimal(); } } 不完全严格遵守工厂模式,IMO,但不再违反您的开放原则. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |