反射与工厂设计模式

一、什么是反射

Java是先编译再运行的语言,而反射可以让我们在程序运行时动态加载类并获取类的详细信息,本质是JVM得到java.lang.Class对象之后,再对class对象进行反编译,从而获取对象的各种信息

二、获取Class对象的三种方式

(1)Object里的getClass方法获取
在这里插入图片描述
(2)每个数据类型(包括基本的数据类型)都有一个静态的class属性
在这里插入图片描述
(3)通过class类的静态方法forName
在这里插入图片描述

三、根据class对象反射实例化对象

利用class.getDeclaredConstructor().newInstance()方法获取对象
在这里插入图片描述

四、一般的工厂模式设计方法

一个接口----若干实现了该接口的类—一个工厂类(工厂类构造函数私有化,给出一个静态的获取实例对象的方法)

interface IMessage {
    public void send();
}
class NetMessage implements IMessage {

    @Override
    public void send() {
        System.out.println("我是netMessage");
    }
}
class ServiceMessage implements IMessage {

    @Override
    public void send() {
        System.out.println("我是serviceMessage");
    }
}
class Factory {
    private Factory(){}
    public static IMessage getInstance(String className){
        if("netMessage".equals(className)){
            return new NetMessage();
        }else{
            return new ServiceMessage();
        }
    }
}
public class Test {
    public static void main(String[] args) {
        IMessage iMessage = Factory.getInstance("netMessage");
        iMessage.send();
    }
}

这段代码存在的一个很严重的问题在于,当IMessage的子类增多时,工厂类又得加上判断,随着子类的增加,工厂类越来越复杂

五、使用反射改进后的工厂设计模式

interface IMessage {
    public void send();
}
class NetMessage implements IMessage {

    @Override
    public void send() {
        System.out.println("我是netMessage");
    }
}
class ServiceMessage implements IMessage {

    @Override
    public void send() {
        System.out.println("我是serviceMessage");
    }
}
class Factory {
    private Factory(){}
    public static IMessage getInstance(String className){
        try{
            return (IMessage) Class.forName(className).getDeclaredConstructor().newInstance(); 
        }catch(Exception e){
            e.printStackTrace();
        }
        
    }
}
public class Test {
    public static void main(String[] args) {
        IMessage iMessage = Factory.getInstance("NetMessage");
        iMessage.send();
    }
}

现在又有了一个新的问题,当一个工厂类需要同时对多个接口进行对象的实例化时,怎么做?

六、使用泛型实现工厂多接口的实例化

class Factory {
    private Factory(){}
    public static  T getInstance(String className){
        try{
            return (T) Class.forName(className).getDeclaredConstructor().newInstance();
        }catch(Exception e){
            e.printStackTrace();
        }

    }
}

你可能感兴趣的:(java后端)