在Java中,实现具有多个实现类的接口并为每个实现类定义一个名字的方法,可以通过使用工厂模式或服务定位器模式来完成。以下是使用工厂模式的一个示例:
定义接口和实现类
首先,定义一个接口和多个实现类:
java
// 接口
public interface ServiceInterface {
void serve();
}
// 实现类1
public class ServiceImpl1 implements ServiceInterface {
@Override
public void serve() {
System.out.println("Serve method of ServiceImpl1");
}
}
// 实现类2
public class ServiceImpl2 implements ServiceInterface {
@Override
public void serve() {
System.out.println("Serve method of ServiceImpl2");
}
}
创建工厂类
然后,创建一个工厂类来根据给定的名字实例化相应的实现类:
java
public class ServiceFactory {
public static ServiceInterface getService(String name) {
switch (name) {
case "Impl1":
return new ServiceImpl1();
case "Impl2":
return new ServiceImpl2();
default:
throw new IllegalArgumentException("Unknown service implementation: " + name);
}
}
}
使用工厂类:
java
public class Main {
public static void main(String[] args) {
// 获取实现类实例
ServiceInterface service1 = ServiceFactory.getService("Impl1");
service1.serve(); // 输出: Serve method of ServiceImpl1
ServiceInterface service2 = ServiceFactory.getService("Impl2");
service2.serve(); // 输出: Serve method of ServiceImpl2
}
}
方法二:
注册机制。可以定义一个hashmap,每个实现类注册自身到工厂,这里要用到spring的initializingBean:
工厂类:
java
public class ClusterFactory {
// 处理类Map
private static final Map<String, ClusterHandler> CLUSTER_FACTORY = new HashMap<>(8);
// 获取处理类
public static ClusterHandler get(String type) {
return CLUSTER_FACTORY.get(type);
}
// 注册处理类
public static void register(String type, ClusterHandler clusterHandler) {
if (null == type) {
return;
}
CLUSTER_FACTORY.put(type, clusterHandler);
}
}
实现类:
java
//一个实现类
@Service
@Slf4j
public class CloudClusterHandler extends ClusterHandler {
@Override
public void afterPropertiesSet() {
ClusterFactory.register(ClusterTypeEnum.CLOUD.getName(), this);
}
}