我的代码如下所示
public interface ICar { void Created(); } public class BigCar : ICar { public void Created() { } } public class SmallCar : ICar { public void Created() { } } public class LuxaryCar : ICar { public void Created() { } } public class CarFactory { public ICar CreateCar(int carType) { switch (carType) { case 0: return new BigCar(); case 1: return new SmallCar(); case 2: return new LuxaryCar(); default: break; } return null; } }
在这段代码中,我有一个返回具体实例的工厂.但每次我需要有一个新的ICar接口实现时,我必须更改CarFactory的CreateCar()方法.我似乎不支持SOLID原则的开放封闭原则.请建议有更好的方法来处理这种情况.
解决方法
您可能希望使其可配置,如下所示:
void Main() { // configurable array var factories = new ICarFactory[] { new BigCarFactory() }; // create factory var realfactory = new CarFactory(factories); // create car var car = realfactory.CreateCar(0); } public class CarFactory : ICarFactory { private ICarFactory[] _factories; public CarFactory (ICarFactory[] factories) { _factories = factories; } public ICar CreateCar(int carType) { return _factories.Where(x=>x.SupportCar(carType)).First().CreateCar(carType); } public bool SupportCar(int type) => _factories.Any(x=>x.SupportCar(type)); } public interface ICarFactory { ICar CreateCar(int type); bool SupportCar(int type); } public class BigCarFactory : ICarFactory { public ICar CreateCar(int carType) { if(carType != 0) throw new NotSupportedException(); return new BigCar(); } public bool SupportCar(int type) => type == 0; } public interface ICar { void Created(); } public class BigCar : ICar { public void Created() { } } public class SmallCar : ICar { public void Created() { } } public class LuxaryCar : ICar { public void Created() { } }