欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式 用反射改进工厂模式

程序员文章站 2022-02-16 19:22:38
...

设计模式 用反射改进工厂模式

我们先写一个接口
Animal.java

package 反射工厂;

public interface Animal {
	void voice();
}

在写几个实现类
Cat.java

package 反射工厂;

public class Cat implements Animal{

	@Override
	public void voice() {
		System.out.println("miao miao miao");
	}

}

Dog.java

package 反射工厂;

public class Dog implements Animal{

	@Override
	public void voice() {
		System.out.println("wang wang wang");
	}

}

Fesh.java

package 反射工厂;

public class Fesh implements Animal{

	@Override
	public void voice() {
		System.out.println("mian mian mian");
	}

}

在写工厂类
AnimalFactory .java

package 反射工厂;

public class AnimalFactory {
	private AnimalFactory() {
		
	}
	@SuppressWarnings("deprecation")
	public static Animal newInstance(String mm) {
		Animal animal=null;
		try {
			Class<?> clazz = Class.forName(mm);
			animal=(Animal)clazz.newInstance();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return animal;
	}
}

最后进行测试

package 反射工厂;

import java.util.Scanner;

public class Test {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		for(int i=0;i<5;i++) {
			System.out.println("请输入名称");
			String s=input.next();
			String sb="反射工厂."+s;
			Animal animal=AnimalFactory.newInstance(sb);
			animal.voice();
	}
}
}

总结:

通过newInstance(String mm)传入字符串mm
我们可以得到这个类
通过Class<?> clazz = Class.forName(mm);
animal=(Animal)clazz.newInstance();
我们可以得到关于这个类的对象
然后就可以操作类里面的方法了

好处:
如果你在增加实体类,不用去工厂类里面去改动数据了。
相比于传统的工厂模式,减少了工作量。

相关标签: 设计模式