有关反射和简单工厂模式的简单实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有关反射和简单工厂模式的简单实现相关的知识,希望对你有一定的参考价值。
先抛出两个概念,反射机制和简单工厂模式。
一句话谈谈自己的理解
反射机制就是由参数(包名类名的字符串),获取具体类的属性方法。简单工程模式就是由一个类作公共出口来生成其他类的实例,父类子类生成模式的简单应用,可以由参数来决定具体需要的实例。往下看,是我搜到的解释,相对完善一点。
什么是反射机制?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。上述是百度百科的解释。反射机制是JAVA编程动态性的一种体现。
什么是简单工厂模式?
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
接下来看代码。
首先声明一个接口Friuit
package com.java.factory; /** * 接口 Fruit * */ public interface Fruit { public abstract void eat(); }
然后是接口的两个实现,Apple和Orange
package com.java.factory; public class Apple implements Fruit { @Override public void eat() { System.out.println("I‘m eating APPLE"); } }
package com.java.factory; public class Orange implements Fruit { @Override public void eat() { System.out.println("I‘m eating ORANGE"); } }
都是比较简单的代码。接口以及接口的实现类都有了之后,就需要构造工厂类了。
package com.java.factory; public class Factory { public static Fruit getInstance(String className) { Fruit f=null; try { f = (Fruit)Class.forName(className).newInstance(); } catch (Exception e) { e.printStackTrace(); } return f; } public static Fruit getInstanceFunc(String className) { Fruit f=null; if(className.equals("Apple")) { f = new Apple(); } else if(className.equals("Orange")) { f = new Orange(); } /* 添加一个Fruit接口的实现,就要在这里添加一个条件判断 */ return f; } }
工厂类写了两个函数,主要是用来对比使用反射机制和不使用反射机制上,代码的构成是怎样。其中这一局代码:
Class.forName(className).newInstance()
也就是反射机制的具体应用。如果不使用反射机制,像在getInstanceFunc方法里面,每次新增一个Fruit的实现类,都需要修改工厂类代码。没有对比就没有伤害,相比之下应用反射机制的getInstance方法就要灵活许多。
那么,测试一下。
package com.java.factory; public class Main { public static void main(String[] s) { System.out.println("-------init Apple-------"); Fruit fApple = Factory.getInstance("com.java.factory.Apple"); if(fApple!=null) { fApple.eat(); } System.out.println("-------init Orange-------"); Fruit fOrange = Factory.getInstance("com.java.factory.Orange"); if(fOrange!=null) { fOrange.eat(); } } }
测试代码没什么好说的,看一下结果:
-------init Apple------- I‘m eating APPLE -------init Orange------- I‘m eating ORANGE
反射机制的主要优点就是他的灵活性,那么其实反射机制也有它的缺点,主要是两方面:
其一是对性能会有影响。反射机制生成对象有一个内部的程序解释过程,比直接new一个对象要慢,这也是应用的时候需要考虑的。
其二是反射机制会模糊程序内部实际会发生的事情。
贴一下工厂模式的优缺点,我也没理解透彻,在后面的项目中再慢慢理解:
优点:
- 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
- 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
- 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
缺点:
- 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
- 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
- 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
以上是关于有关反射和简单工厂模式的简单实现的主要内容,如果未能解决你的问题,请参考以下文章