有关反射和简单工厂模式的简单实现

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一个对象要慢,这也是应用的时候需要考虑的。

其二是反射机制会模糊程序内部实际会发生的事情。

 

贴一下工厂模式的优缺点,我也没理解透彻,在后面的项目中再慢慢理解:

优点:
  • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
 缺点:
  • 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
  • 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
  • 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
  • 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

以上是关于有关反射和简单工厂模式的简单实现的主要内容,如果未能解决你的问题,请参考以下文章

深入理解设计模式-策略模式(结合简单工厂反射Spring详细讲解)

工厂模式--简单工厂模式

一抽象工厂模式&&简单工厂+反射改进抽象工厂

Java反射机制用反射改进简单工厂模式设计

Java反射+简单工厂模式总结

常用设计模式之简单工厂(使用反射)