美文网首页
*反射机制3(反射实例化对象)工厂模式优化

*反射机制3(反射实例化对象)工厂模式优化

作者: 秋笙fine | 来源:发表于2019-01-28 16:16 被阅读0次

当拿到一个类的时候,肯定要直接使用关键字new进行对象实例化操作,但是如果有了Class类对象,那么就可以做到,利用反射来实现对象实例化操作。

Class类中的实例化对象方法:

public T newInstance()
              throws InstantiationException,
                     IllegalAccessException

范例:利用反射实例化对象(实例化Book类对象)

    public static void main(String[] args) throws Exception{
        
        Class <?> cls=Class.forName("TestDemo.Book");//取得Book类
        Object obj=cls.newInstance();//取得Book类实例化对象 相当于使用new调用无参构造实例化
        System.out.println(obj);

    }   
image.png

有了反射之后,以后进行对象实例化的操作不再是单独依靠关键字new,反射也可以完成。

在任何的开发之中,new是造成耦合的最大元凶,一切的耦合都起源于new,为了完成高内聚,低耦合,Spring,SpringMVC都内置了反射。

范例:观察我们原先的工厂设计模式

package TestDemo;


interface Fruit{
    public void eat();
}
class Apple implements Fruit{
    @Override
    public void eat() {
        System.out.println("eat apple");
    }
}

class Factory{
    public static Fruit getInstance(String className){
        if("apple".equals(className)){
            return new Apple();
        }
        return null;
    }


}







public class TestDemo{
    
    public static void main(String[] args) throws Exception{
        Fruit f=Factory.getInstance("apple");
        f.eat();

    }   
}

如果此时增加了Fruit接口子类,那么就表示程序要修改工厂类,每增加一个类就要取修改工厂类,那么如果随时可能增加子类,那么工厂类就要一直进行修改,因为工厂类中的对象都是通过new直接实例化的,而new就成了所有问题的关键点。要想解决这一问题,就只能够依靠反射完成。

package TestDemo;


interface Fruit{
    public void eat();
}
class Apple implements Fruit{
    @Override
    public void eat() {
        System.out.println("eat apple");
    }
}

class Orange implements Fruit{
    @Override
    public void eat() {
        System.out.println("eat orange");
    }
}

class Factory{
    public static Fruit getInstance(String className){
        Fruit f=null;
        try {
            f=(Fruit)Class.forName(className).newInstance();//根据传入参入进行子类实例化获取
        } catch (Exception e) {
            //TODO: handle exception
        }
        
        return f;
    }
}

public class TestDemo{
    
    public static void main(String[] args) throws Exception{
        Fruit f=Factory.getInstance("TestDemo.Apple");
        f.eat();

    }   
}

这样就不需要修改工厂类,程序完成了解耦和的目的,并且可扩展性非常强。

相关文章

  • *反射机制3(反射实例化对象)工厂模式优化

    当拿到一个类的时候,肯定要直接使用关键字new进行对象实例化操作,但是如果有了Class类对象,那么就可以做到,利...

  • 常用设计模式

    工厂设计模式 工厂设计模式,主要用于进行实例化对象时的解耦操作,避免使用new关键字实例化对象,通过反射,根据类名...

  • Java 反射机制 (转)

    目录反射机制是什么反射机制能做什么反射机制的相关API通过一个对象获得完整的包名和类名实例化Class类对象获取一...

  • 用静态工厂来封装retrofit

    用静态工厂来封装retrofit 利用反射机制和静态工厂模式,对retrofit进行简单的封装 利用反射机制,动态...

  • Java 反射进阶

    1. 使用反射调用方法 2. 工厂模式 工厂模式主要负责对象创建的问题可通过反射进行工厂模式的设计,完成动态的对象...

  • 基础知识面试

    1. iOS反射机制? 通过类名的字符串形式实例化对象 Classclass=NSClassFromString(...

  • 反射破坏单例模式(静态内部类)

    java反射,破坏单例模式 静态内部类 反射实例化单例

  • springIOC实现原理

    所使用的技术 ① dom4j解析xml文档; ② 工厂模式(在工厂中调用反射) ③ 采用反射设计模式创建对象 IO...

  • 面向对象(二)

    深入构造器 构造器用于在创建实例时执行初始化。构造器是创建对象的重要途径(即使使用工厂模式、反射等方式创建对象,其...

  • Java高级-反射

    15.1.Java反射机制概述 15.2.理解Class类并获取Class实例(重点) 用反射实现类的实例化,调用...

网友评论

      本文标题:*反射机制3(反射实例化对象)工厂模式优化

      本文链接:https://www.haomeiwen.com/subject/ugmajqtx.html