gpt4 book ai didi

c# - 工厂类不支持 SOLID 原则

转载 作者:太空狗 更新时间:2023-10-29 21:16:34 25 4
gpt4 key购买 nike

我的代码如下所示

 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 接口(interface)进行新的实现时,我都必须更改 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()
{

}
}

关于c# - 工厂类不支持 SOLID 原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39488191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com