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

请教:该OOP多态示例是否正确?如何用依赖注入彻底解耦代码?

解决Driver与Vehicle子类的紧耦合问题

你当前的Driver类设计是符合面向对象原则的——它依赖抽象的Vehicle而非具体子类,但问题出在main方法直接实例化Car、MotorBike,导致main方法与这些具体实现类紧耦合。你改写后的代码只是简化了实例化写法,并没有从根本上解除耦合。

原问题代码

public class Driver{
    void drive(Vehicle vehicle){
        vehicle.moveForward();
        vehicle.moveBackward();
    }
}

// 存在紧耦合的代码
public static void main(String[] args){
    Vehicle car = new Car(); // 直接依赖Car类
    Vehicle motorBike = new MotorBike(); // 直接依赖MotorBike类
    Driver driver = new Driver();
    
    driver.drive(car);
    driver.drive(motorBike);
}

你改写的代码

// 你改写后的代码
public static void main(String[] args){
    Driver driver = new Driver();
    
    driver.drive(new Car());
    driver.drive(new MotorBike());
}

解决方案:通过工厂模式解耦

核心是把具体Vehicle子类的实例化逻辑从main方法中抽离,封装到专门的工厂类中,让上层代码只依赖抽象而非具体实现。

方式一:简单静态工厂

// 车辆工厂类,封装实例化逻辑
public class VehicleFactory {
    public static Vehicle createCar() {
        return new Car();
    }

    public static Vehicle createMotorBike() {
        return new MotorBike();
    }
}

// 修改后的main方法
public static void main(String[] args) {
    Driver driver = new Driver();
    
    driver.drive(VehicleFactory.createCar());
    driver.drive(VehicleFactory.createMotorBike());
}

方式二:抽象工厂(更灵活,符合开闭原则)

如果后续需要新增更多Vehicle子类,这种方式无需修改现有代码,只需新增对应工厂实现:

// 抽象工厂接口
public interface VehicleFactory {
    Vehicle createVehicle();
}

// Car对应的工厂实现
public class CarFactory implements VehicleFactory {
    @Override
    public Vehicle createVehicle() {
        return new Car();
    }
}

// MotorBike对应的工厂实现
public class MotorBikeFactory implements VehicleFactory {
    @Override
    public Vehicle createVehicle() {
        return new MotorBike();
    }
}

// 修改后的main方法
public static void main(String[] args) {
    Driver driver = new Driver();
    
    VehicleFactory carFactory = new CarFactory();
    driver.drive(carFactory.createVehicle());
    
    VehicleFactory bikeFactory = new MotorBikeFactory();
    driver.drive(bikeFactory.createVehicle());
}

说明

通过上述改造,main方法不再直接引用Car、MotorBike这些具体类,而是通过工厂获取抽象的Vehicle实例。后续如果要替换Vehicle的实现(比如新增Truck类),只需要修改工厂类或新增对应的工厂实现,无需改动main方法和Driver类,彻底解除了紧耦合。

内容的提问来源于stack exchange,提问作者황희윤

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:28:39