反射与工厂模式

一、反射

什么是反射

通俗的讲就是反射可以在运行时根据指定的类名获得类的信息,运行时确定类型,属于动态编译,发挥了java的灵活性;
在实际运用中,例如Spring中是可以通过修改配置文件来修改需要访问的类,而不需要重新修改代码

二、工厂模式

工厂模式与反射运用

package Factory;

interface IMessage{
	public void send();
}

}

class NetMessage implements IMessage{

	public void send() {
		System.out.println("【发送】----网络----消息");
		
	}
	
}
class LocalMessage implements IMessage{
	
	public void send() {
		System.out.println("【发送】----本地----消息");
		
	}
	
}


public class Factory {
	public static IMessage getInstance(String MessageName) {
		IMessage instance=null;
		if("NetMessage".equals(MessageName)) 
			instance=new NetMessage();
		
		
		if("LocalMessage".equals(MessageName))
			instance=new LocalMessage();
		return instance;
	}
}

可以想象,如果通过IMessage接口实现的类越来越多,Factory中的getInstance()会出现大量if语句,造成阅读困难,并且,如果我们设计一个IReceive接口,也想通过该工厂类获得实例,这样的函数设计是不行的,因此可以由以下的改进

package Factory;


/*
*@author Lyon
*@date 2019年6月28日
*/

interface IMessage{
	public void send();
}
interface IReceive{
	public void getMessage();
	
}
class LocalReceive implements IReceive{

	@Override
	public void getMessage() {
		System.out.println("【接受】----本地----消息");
		
	}
	
}
class NetReceive implements IReceive{

	@Override
	public void getMessage() {
		System.out.println("【接受】----网络----消息");
		
	}
	
}

class NetMessage implements IMessage{

	@Override
	public void send() {
		System.out.println("【发送】----网络----消息");
		
	}
	
}
class LocalMessage implements IMessage{

	
	public void send() {
		System.out.println("【发送】----本地----消息");
		
	}
	
}
public class Factory {
//通过泛型来实现对任意接口类的接收,通过反射className来确定具体生成的实例
	public static  T getInstance(String className) {
		T instance =null;
		try {
			instance=(T) Class.forName(className).getDeclaredConstructor().newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		
	}
		return instance;
}

这样设计后的工厂类就能很好的接受IMessage和IReceive的实现类了

public class Main {
	public static void main(String[] args) {
	//有两种方式得到className,一种是字符串写出类名,另一种是xxx.class.getName();
		String className="Factory.LocalMessage";
		
		IMessage msg= Factory.getInstance(className);
		msg.send();
		msg=Factory.getInstance(NetMessage.class.getName());
		msg.send();
		IReceive rev=Factory.getInstance(LocalReceive.class.getName());
		rev.getMessage();
	}
	
}

运行结果如下:

【发送】----本地----消息
【发送】----网络----消息
【接受】----本地----消息

你可能感兴趣的:(java学习)