Java实现同一个接口的类 怎么知道用那个

问题描述

在Java中,我们经常会遇到一个接口被多个类实现的情况。在某些情况下,我们需要根据具体的条件选择使用哪个实现类。例如,我们有一个接口 Shape,它有两个实现类 CircleRectangle,我们想根据用户的输入选择使用哪个实现类来创建对象。

解决方案

为了解决这个问题,我们可以使用工厂模式来实现。工厂模式是一种创建对象的设计模式,它提供了一个接口来创建对象,但是将具体的实现类的选择延迟到子类中。

具体实现方案如下:

  1. 定义一个接口 Shape,包含一个 draw 方法,该方法用于绘制形状。
  2. 创建两个实现类 CircleRectangle,分别实现 Shape 接口,并在 draw 方法中实现具体的绘制逻辑。
  3. 定义一个工厂类 ShapeFactory,它包含一个静态方法 createShape,该方法根据传入的参数选择并返回相应的实现类的实例。

下面是具体的代码示例:

// Shape 接口
public interface Shape {
    void draw();
}

// Circle 实现类
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制圆形");
    }
}

// Rectangle 实现类
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制矩形");
    }
}

// ShapeFactory 工厂类
public class ShapeFactory {
    public static Shape createShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        }
        return null;
    }
}

在上述代码中,CircleRectangle 分别实现了 Shape 接口,并在 draw 方法中分别实现了绘制圆形和绘制矩形的逻辑。

ShapeFactory 是工厂类,其中的 createShape 方法根据传入的参数 shapeType 选择并返回相应的 Shape 实例。如果传入的参数是 "CIRCLE",则返回一个 Circle 实例;如果传入的参数是 "RECTANGLE",则返回一个 Rectangle 实例。

使用工厂类的示例代码如下:

public class Main {
    public static void main(String[] args) {
        Shape circle = ShapeFactory.createShape("CIRCLE");
        circle.draw(); // 输出:绘制圆形
        
        Shape rectangle = ShapeFactory.createShape("RECTANGLE");
        rectangle.draw(); // 输出:绘制矩形
    }
}

在上述代码中,我们通过调用 ShapeFactorycreateShape 方法来获取具体的 Shape 实例,然后调用 draw 方法来绘制形状。

类图

下面是上述代码的类图表示:

classDiagram
    interface Shape {
        +void draw()
    }
    class Circle {
        +void draw()
    }
    class Rectangle {
        +void draw()
    }
    class ShapeFactory {
        +Shape createShape(String shapeType)
    }
    Shape <|.. Circle
    Shape <|.. Rectangle
    ShapeFactory ..> Shape

总结

通过使用工厂模式,我们可以在运行时决定使用哪个实现类来创建对象。这种方式可以提高代码的可扩展性和灵活性,使代码更易于维护和修改。同时,工厂模式还可以将对象的创建和使用解耦,使代码更加模块化和可测试。

在实际开发中,我们可以根据具体的需求和场景选择合适的设计模式。工厂模式是一种常用的创建对象的设计模式,它在Java中被广泛应用,可以帮助我们解决类似的问题。希望本文能够对你理解和应用工厂模式有所帮助。