java一个接口多个实现类的调用方式

 更新时间:2023年09月25日 16:25:48   作者:落弋V  
这篇文章主要给大家介绍了关于java一个接口多个实现类的调用方式的相关资料,经测试确认,当一个接口有多个实现时,调用时只会执行一个,有时候需要多个实现调用,需要的朋友可以参考下

在 Java 中,如果一个接口有多个实现类,可以通过以下几种方式来调用不同的实现类:

  • 根据具体实现类的类型进行调用:
InterfaceA objA = new ImplementationA();
InterfaceA objB = new ImplementationB();
objA.method(); // 调用 ImplementationA 的实现方法
objB.method(); // 调用 ImplementationB 的实现方法
  • 利用接口的引用,根据条件判断调用不同的实现类:
InterfaceA obj;
if (condition) {
    obj = new ImplementationA();
} else {
    obj = new ImplementationB();
}
obj.method(); // 根据条件调用不同的实现类方法
  • 在集合中存储不同的实现类对象,通过循环遍历调用:
List<InterfaceA> objects = new ArrayList<>();
objects.add(new ImplementationA());
objects.add(new ImplementationB());
for (InterfaceA obj : objects) {
    obj.method(); // 循环遍历调用不同实现类的方法
}
  • 使用工厂模式或依赖注入框架来动态获取不同的实现类对象:
InterfaceA obj = ObjectFactory.getInstance().createInterfaceA();
obj.method(); // 动态获取实现类对象并调用方法

需要根据具体的应用场景和需求选择适合的方式来调用不同的实现类。在代码中,根据接口类型、条件判断、集合遍历或动态获取实例等方式,可以灵活地调用不同的实现类的方法。

除了上述方案,还有以下一些方案可以实现在 Java 中调用多个实现类:

  • 使用注解:通过为实现类添加特定的注解,在需要调用的地方通过注解扫描来获取实现类,并进行调用。
  • 使用代理模式:通过动态代理机制,在运行时生成代理对象,并在代理对象中根据条件调用不同的实现类的方法。
  • 使用配置文件:将不同实现类的信息配置在文件中,通过读取配置文件来获取实现类,并进行调用。
  • 使用动态加载:使用 Java 的动态加载机制,根据类名或条件动态加载不同的实现类,并进行调用。

工厂模式得示例代码一

当涉及到工厂模式时,可以按照以下步骤实现:

创建接口:

public interface ProductService {
    void getProductInfo();
}

创建具体的实现类:

public class ProductAService implements ProductService {
    @Override
    public void getProductInfo() {
        System.out.println("Product A info");
    }
}
public class ProductBService implements ProductService {
    @Override
    public void getProductInfo() {
        System.out.println("Product B info");
    }
}

创建工厂类:

public class ProductServiceFactory {
    public static ProductService createProductService(String productType) {
        if (productType.equalsIgnoreCase("A")) {
            return new ProductAService();
        } else if (productType.equalsIgnoreCase("B")) {
            return new ProductBService();
        } else {
            throw new IllegalArgumentException("Invalid product type");
        }
    }
}

使用工厂类获取实例并调用方法:

public class Main {
    public static void main(String[] args) {
        ProductService productServiceA = ProductServiceFactory.createProductService("A");
        productServiceA.getProductInfo(); // 输出:Product A info
        ProductService productServiceB = ProductServiceFactory.createProductService("B");
        productServiceB.getProductInfo(); // 输出:Product B info
    }
}

在上述示例中,通过工厂类的静态方法 createProductService 根据传入的参数(产品类型)动态创建具体的实现类对象。根据不同的产品类型,工厂类返回不同的实例,并通过接口引用调用对应的方法。这样可以在运行时决定具体使用哪个实现类,而无需在代码中直接创建对象。

工厂模式得示例代码(Map实现)二

通过 Map 来实现工厂模式是一种常见的方式,可以将不同的产品类型与对应的实现类进行映射。以下是使用 Map 实现工厂模式的示例代码:

创建接口:

public interface ProductService {
    void getProductInfo();
}

创建具体的实现类:

public class ProductAService implements ProductService {
    @Override
    public void getProductInfo() {
        System.out.println("Product A info");
    }
}
public class ProductBService implements ProductService {
    @Override
    public void getProductInfo() {
        System.out.println("Product B info");
    }
}

创建工厂类:

import java.util.HashMap;
import java.util.Map;
public class ProductServiceFactory {
    private static final Map<String, ProductService> productMap = new HashMap<>();
    static {
        productMap.put("A", new ProductAService());
        productMap.put("B", new ProductBService());
    }
    public static ProductService createProductService(String productType) {
        ProductService productService = productMap.get(productType);
        if (productService == null) {
            throw new IllegalArgumentException("Invalid product type");
        }
        return productService;
    }
}

使用工厂类获取实例并调用方法:

public class Main {
    public static void main(String[] args) {
        ProductService productServiceA = ProductServiceFactory.createProductService("A");
        productServiceA.getProductInfo(); // 输出:Product A info
        ProductService productServiceB = ProductServiceFactory.createProductService("B");
        productServiceB.getProductInfo(); // 输出:Product B info
    }
}

在这个示例中,工厂类通过一个静态的 Map 对象将产品类型与对应的实现类进行映射。在工厂类的 createProductService 方法中,根据传入的产品类型从 Map 中获取对应的实现类实例,并返回给调用方。这样,在运行时可以根据不同的产品类型获取对应的实例对象。

工厂模式得示例代码(注解实现)三

以下是一个使用注解实现多个实现类调用的示例代码:

定义注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyImplementation {
    String value();
}

创建接口:

public interface MyInterface {
    void doSomething();
}

创建具体的实现类,并使用注解标记:

@MyImplementation("A")
public class ImplementationA implements MyInterface {
    @Override
    public void doSomething() {
        System.out.println("Implementation A");
    }
}
@MyImplementation("B")
public class ImplementationB implements MyInterface {
    @Override
    public void doSomething() {
        System.out.println("Implementation B");
    }
}

创建工厂类,使用注解扫描获取对应实现类:

import java.util.HashMap;
import java.util.Map;
public class MyFactory {
    private static final Map<String, MyInterface> implementations = new HashMap<>();
    static {
        // 扫描带有@MyImplementation注解的类,并将其实例化并放入implementations Map中
        Reflections reflections = new Reflections("com.example");
        Set<Class<?>> annotatedClasses = reflections.getTypesAnnotatedWith(MyImplementation.class);
        for (Class<?> annotatedClass : annotatedClasses) {
            MyImplementation annotation = annotatedClass.getAnnotation(MyImplementation.class);
            String implementationKey = annotation.value();
            try {
                MyInterface implementation = (MyInterface) annotatedClass.newInstance();
                implementations.put(implementationKey, implementation);
            } catch (InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
    public static MyInterface getImplementation(String key) {
        return implementations.get(key);
    }
}

使用工厂类获取实例并调用方法:

public class Main {
    public static void main(String[] args) {
        MyInterface implementationA = MyFactory.getImplementation("A");
        implementationA.doSomething(); // 输出:Implementation A
        MyInterface implementationB = MyFactory.getImplementation("B");
        implementationB.doSomething(); // 输出:Implementation B
    }
}

在这个示例中,通过自定义的注解 @MyImplementation 标记具体的实现类,然后使用反射扫描带有该注解的类,并实例化放入工厂类的 implementations Map 中。通过工厂类的 getImplementation 方法,根据指定的实现类标识符获取对应的实现类实例。然后就可以通过实例调用接口定义的方法

工厂模式得示例代码(枚举实现)四

枚举也可以用于实现工厂模式,其中每个枚举常量都代表一个具体的实现类。以下是一个使用枚举实现工厂模式的示例代码:

public interface MyInterface {
    void doSomething();
}
public class ImplementationA implements MyInterface {
    @Override
    public void doSomething() {
        System.out.println("Implementation A");
    }
}
public class ImplementationB implements MyInterface {
    @Override
    public void doSomething() {
        System.out.println("Implementation B");
    }
}
public enum MyFactory {
    IMPLEMENTATION_A {
        @Override
        public MyInterface create() {
            return new ImplementationA();
        }
    },
    IMPLEMENTATION_B {
        @Override
        public MyInterface create() {
            return new ImplementationB();
        }
    };
    public abstract MyInterface create();
}
public class Main {
    public static void main(String[] args) {
        MyInterface implementationA = MyFactory.IMPLEMENTATION_A.create();
        implementationA.doSomething(); // 输出:Implementation A
        MyInterface implementationB = MyFactory.IMPLEMENTATION_B.create();
        implementationB.doSomething(); // 输出:Implementation B
    }
}

在这个示例中,枚举 MyFactory 表示工厂,每个枚举常量代表一个具体的实现类。每个枚举常量都实现了抽象方法 create(),该方法用于创建对应的实现类对象。在 Main 类中,通过枚举常量调用 create() 方法来创建具体的实现类对象,并调用接口方法

总结

到此这篇关于java一个接口多个实现类的调用方式的文章就介绍到这了,更多相关java一个接口多个实现类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot集成Druid监控页面最小化配置操作

    SpringBoot集成Druid监控页面最小化配置操作

    这篇文章主要介绍了SpringBoot集成Druid监控页面最小化配置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • java 中HashMap实现原理深入理解

    java 中HashMap实现原理深入理解

    这篇文章主要介绍了java 中HashMap实现原理深入理解的相关资料,需要的朋友可以参考下
    2017-03-03
  • 在Filter中不能注入bean的问题及解决

    在Filter中不能注入bean的问题及解决

    这篇文章主要介绍了在Filter中不能注入bean的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 基于SpringBoot实现IP黑白名单的详细步骤

    基于SpringBoot实现IP黑白名单的详细步骤

    IP黑白名单是网络安全管理中常见的策略工具,用于控制网络访问权限,根据业务场景的不同,其应用范围广泛,比如比较容易被盗刷的短信接口、文件接口,都需要添加IP黑白名单加以限制,所以本文给大家介绍了基于SpringBoot实现IP黑白名单的详细步骤,需要的朋友可以参考下
    2024-01-01
  • SpringBoot实现excel文件生成和下载

    SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • 深入jetty的使用详解

    深入jetty的使用详解

    本篇文章是对jetty的使用进行了详细的分析解释。需要的朋友参考下
    2013-05-05
  • JDK17安装教程以及其环境变量配置教程

    JDK17安装教程以及其环境变量配置教程

    环境变量对Java初学者来说真的是一件头疼的事,本人也经历过这样的事情,这篇文章主要给大家介绍了关于JDK17安装教程以及其环境变量配置的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • JavaWeb Servlet生命周期细枝末节处深究

    JavaWeb Servlet生命周期细枝末节处深究

    Servlet指在服务器端执行的一段Java代码,可以接收用户的请求和返回给用户响应结果,下面这篇文章主要给大家介绍了关于JavaWeb.servlet生命周期的相关资料,需要的朋友可以参考下
    2022-10-10
  • Java 创建线程的3种方法及各自的优点

    Java 创建线程的3种方法及各自的优点

    这篇文章主要介绍了Java 创建线程的3种方法及各自的优点,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Java main 方法面试题的详细整理

    Java main 方法面试题的详细整理

    这篇文章主要介绍了Java main 方法面试题的详细整理的相关资料,这里介绍了10个经典面试题的方法,需要的朋友可以参考下
    2017-09-09

最新评论