You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中工厂设计模式是否违反SOLID原则的依赖倒置原则?

工厂模式是否违反依赖倒置原则?

根据定义,依赖注入能实现松耦合、可维护且可测试的代码,通过接口和构造函数注入可以获取实现接口的类对象。但在实现工厂模式时,通常会在工厂方法中根据传入类型直接创建具体对象,比如下面的示例:

interface IVehicle
{
    int WheelCount();
}

class Car : IVehicle
{
    public int WheelCount() 
    { 
        return 4; 
    }
}

class Bike : IVehicle
{
    public int WheelCount()
    {
        return 2;
    }
}

class VehicleFactory
{
    public IVehicle FactoryMethod(string type)
    {
        switch(type)
        {
            case "bike":
                return new Bike();
            case "car":
                return new Car();
            default:
                throw new ArgumentException("Invalid vehicle type");
        }
    }
}

在Main()方法中的调用:

VehicleFactory factory = new VehicleFactory();
IVehicle vehicle = factory.FactoryMethod("bike");

很多人会疑惑:工厂方法里直接实例化具体类,这是不是违反了依赖倒置原则(DIP)?

先明确依赖倒置原则的核心要求:

  • 高层模块不应该依赖低层模块,两者都应该依赖抽象
  • 抽象不应该依赖细节,细节应该依赖抽象

回到这个工厂实现:

  • 高层模块(比如Main方法)并没有直接依赖Car或Bike这些具体类,它只依赖VehicleFactory和IVehicle这两个抽象/接口,这完全符合DIP的核心目标——让高层业务逻辑与具体实现解耦,后续新增其他IVehicle实现类时,Main方法不需要做任何修改。
  • 工厂类本身确实直接依赖了Car和Bike,但这是工厂模式的职责所在:封装对象的创建逻辑。工厂就是专门处理对象实例化的模块,它依赖具体类是合理的,因为它的存在就是为了让其他模块不用去依赖这些具体类,把对具体类的依赖集中到了一处。

换句话说,DIP的核心是避免业务逻辑和具体实现绑定,而工厂模式恰恰是实现这个目标的手段之一。这种实现并没有违反依赖倒置原则。

当然,如果想要让工厂更灵活,也可以做进一步优化——比如通过配置文件注册具体类与类型标识的映射,再用反射创建对象,这样新增IVehicle实现时不需要修改工厂代码,但这种优化只是提升扩展性,并不是说基础的工厂实现违反了DIP。

内容的提问来源于stack exchange,提问作者Sandhya Ratan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:28:29