学习Java(78)_反射在工厂模式中的作用

实例化对象,new和反射都能够做到,为什么还要那么麻烦使用反射呢?下面是一个简单的工厂模式的范例,通过范例的演示,可以很明显的感受到反射的作用。
在任何开发之中,new是造成耦合的最大元凶,一切的耦合都起源于new
范例:观察工厂模式
interface Fruit
{
	void eat();
}
class Apple implements Fruit
{
	@Override
	public void eat()
	{
		System.out.println( "吃苹果" );
	}
}
class Factory
{
	public static Fruit getInstance( String className )
	{
		if( "Apple".equals( className ) )
		{
			return new Apple();
		}
		
		return null;
	}
}
class TestFactory
{
	public static void main( String[] args )
	{
		Fruit fruit = Factory.getInstance( "Apple" );
		fruit.eat();
	}
}
/*
	在JDK1.8.0_91中运行的结果是:
	============================
	E:\textjava>java TestFactory
	吃苹果
	============================
	总结:
		当传入“Apple”参数的时候,就是输出吃苹果。
		但如果要添加一个类,添加一个橘子类就需要重新修改Factoty类,
		在getInstance()方法中再加上一个elseif,
		假如需要动态的生成很多类,显然不可能每次都手动去添加elseif.
		而这所有的问题的根源都在于是new直接实例化的,
		解决这一问题,就需要依靠反射来完成。
*/
运用了反射的工厂模式
interface Fruit
{
	void eat();
}
class Apple implements Fruit
{
	@Override
	public void eat()
	{
		System.out.println( "吃苹果" );
	}
}
class Orange implements Fruit
{
	@Override
	public void eat()
	{
		System.out.println( "吃橘子" );
	}
}
class Factory
{
	public static Fruit getInstance( String className )
	{
		Fruit fruit = null;
		try
		{
			Class<?> cla = Class.forName( className );
			fruit = ( Fruit )cla.newInstance();
			
		}
		catch( Exception e )
		{
			e.printStackTrace();
		}
		return fruit;
	}
}
class TestFactory_1
{
	public static void main( String[] args )
	{
		Fruit fruit = Factory.getInstance( "Orange" );
		fruit.eat();
	}
}
/*
	在JDK1.8.0_91中运行的结果是:
	============================
	E:\textjava>java TestFactory_1
	吃橘子
	============================
	总结:
		利用反射,无论有多少个子类,都不用修改Factory类中的方法。
*/


小艾的博客 http://www.aixinyan.me/