Java代码之接口实现类工厂模式实现

  • 实现基础
  1. 需要生产的对象类需要实现某个基础接口,例子中实现的是LocalService
  2. 只会生成继承接口的实现类对象
  • 接口
public interface LocalService {
	void initialize();
}
  • 实现类
public class LocalConferenceScheduleService implements LocalService {
	@OverWrite
	void initialize(){};
}
  • 添加依赖
		<!--反射框架依赖-->
		<dependency>
            <groupId>org.reflections</groupId>
            <artifactId>reflections-spring</artifactId>
            <version>0.9.9-RC1</version>
            <exclusions>
                <exclusion>
                    <groupId>javassist</groupId>
                    <artifactId>javassist</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
  • 该工具类可以获取某个接口下所有实现类的类对象(Class类)、
import com.huawei.smc.esdk.service.LocalService;
import org.reflections.Reflections;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class ConfigUtil {

    // 初始化方法名称
    private static final String INIT_METHOD_NAME = "initialize";
    // 要扫描的包名
    private static final String PACKAGE_NAME = "com.huawei.smc.esdk.service.local";

	//test测试
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        List<Class> list = getConfigList();
        for (Class name : list) {
            System.out.println(name.getName());
            //初始化
            //manualInitialize(name);
        }
    }

    /**
     * 获取所有模块名称
     *
     * @return
     */
    public static List<String> getConfigNameList() {
        List<String> nameList = new ArrayList<String>();
        Reflections reflections = new Reflections(PACKAGE_NAME);
        Set<Class<? extends LocalService>> monitorClasses = reflections.getSubTypesOf(LocalService.class);
        if (monitorClasses != null) {
            for (Class<? extends LocalService> config: monitorClasses) {
                boolean isAbstract = Modifier.isAbstract(config.getModifiers());
                //过滤抽象类
                if (!isAbstract) {
                    nameList.add(config.getName());
                }
            }
        }
        return nameList;
    }

    /**
     * 获取所有实现
     *
     * @return
     */
    public static List<Class> getConfigList() {
        List<Class> moduleList= new ArrayList<Class>();
        Reflections reflections = new Reflections(PACKAGE_NAME);
        Set<Class<? extends LocalService>> monitorClasses = reflections.getSubTypesOf(LocalService.class);
        if (monitorClasses != null) {
            for (Class<? extends LocalService> config : monitorClasses) {
                boolean isAbstract = Modifier.isAbstract(config.getModifiers());
                if (!isAbstract) {
                    moduleList.add(config);
                }
            }
        }
        return moduleList;
    }

    /**
     * 调用初始化方法
     *
     * @param fullClassName 全限定名
     */
    @SuppressWarnings("unchecked")
    public static void manualInitialize(String fullClassName) {
        try {
            Class clazz = Class.forName(fullClassName);
            Constructor[] constructors = clazz.getDeclaredConstructors();
            AccessibleObject.setAccessible(constructors, true);
            for (Constructor con : constructors) {
                if (con.isAccessible()) {
                    Object classObject = con.newInstance();
                    Method method = clazz.getMethod(INIT_METHOD_NAME);
                    method.invoke(classObject);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • Factory工厂类
import java.util.List;

public class ServiceFactoryEx {

    public static <T> T getService(Class<? extends T> interfaceClass) {
        T t = null;
        List<Class> classes = ConfigUtil.getConfigList();

        try {
            for (Class clazz : classes) {
                if (interfaceClass.equals(clazz)){
                    t = (T)Class.forName(interfaceClass.getName()).newInstance();
                }
            }
            if (t == null){
                throw new Exception("Class not found");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t;
    }
}
  • 测试
import org.junit.Test;
public class FactoryTest {

    @Test
    public void FactoryTest() {

        LocalConferenceScheduleService service
                = ServiceFactoryEx.getService(LocalConferenceScheduleService.class);
        System.out.println(service.getClass().getName());
    }
}
  • 测试结果
    在这里插入图片描述

  • 注意

获取的对象不是单例

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用工厂方法模式实现四则运算的 Java 代码: 首先,我们需要定义一个抽象的运算,它包含两个操作数和一个计算方法: ``` public abstract class Operation { protected double num1; protected double num2; public Operation(double num1, double num2) { this.num1 = num1; this.num2 = num2; } public abstract double getResult(); } ``` 然后,我们需要定义四个具体的运算,分别实现加、减、乘、除四种运算: ``` public class AddOperation extends Operation { public AddOperation(double num1, double num2) { super(num1, num2); } @Override public double getResult() { return num1 + num2; } } public class SubOperation extends Operation { public SubOperation(double num1, double num2) { super(num1, num2); } @Override public double getResult() { return num1 - num2; } } public class MulOperation extends Operation { public MulOperation(double num1, double num2) { super(num1, num2); } @Override public double getResult() { return num1 * num2; } } public class DivOperation extends Operation { public DivOperation(double num1, double num2) { super(num1, num2); } @Override public double getResult() { if (num2 == 0) { throw new IllegalArgumentException("除数不能为0"); } return num1 / num2; } } ``` 接下来,我们需要定义一个工厂接口,用于创建具体的运算: ``` public interface OperationFactory { Operation createOperation(double num1, double num2); } ``` 最后,我们可以定义四个具体的工厂,分别用于创建加、减、乘、除四种运算: ``` public class AddOperationFactory implements OperationFactory { @Override public Operation createOperation(double num1, double num2) { return new AddOperation(num1, num2); } } public class SubOperationFactory implements OperationFactory { @Override public Operation createOperation(double num1, double num2) { return new SubOperation(num1, num2); } } public class MulOperationFactory implements OperationFactory { @Override public Operation createOperation(double num1, double num2) { return new MulOperation(num1, num2); } } public class DivOperationFactory implements OperationFactory { @Override public Operation createOperation(double num1, double num2) { return new DivOperation(num1, num2); } } ``` 这样,我们就可以使用工厂方法模式来实现四则运算了。例如,如果要进行加法运算,可以这样调用: ``` OperationFactory factory = new AddOperationFactory(); Operation operation = factory.createOperation(1, 2); double result = operation.getResult(); System.out.println(result); // 输出 3.0 ``` 希望这个代码能够帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值