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

java -- 反射之利用反射完善工厂设计模式

程序员文章站 2024-01-20 17:30:16
...

java的工厂设计模式源自于生活,大家先看一个例子,比较简单,我刚开始了解工厂时看到的简单例子。

interface IFruit {
	public void eat();
}
class Apple implements IFruit {
	@Override
	public void eat() {
		System.out.println("苹果削皮吃");
	}

}
public class Factory {
	//此时为什么使用static  ---->Factory产生一个实例化对象无意义!!
	public static IFruit getInstance(String className) {
		if("apple".equals(className)) {
			return new Apple();
		}else {
			return null;
		}
	}
}

原理就是,实例化类时原先本来是放在某个主方法中去实例化,但过于麻烦,所以创建一个工厂,让工厂去管理是否创建某个类的实例化类。

最近再研究java的反射,突然发现,反射不是可以获取指定的类的实例化对象么,就使用反射琢磨着写了个工厂类。

代码如下所示:

/**
 * 创建水果类接口
 * @author 76519
 *
 */
interface IFruit {
	public void eat();
}
class Cherry implements IFruit{
	@Override
	public void eat() {
		System.out.println("吃樱桃....");
	}
}


class Factory{
	private Factory() {};//私有化构造方法   使其不能直接实例化
	
	//创建实例化工厂方式
	public static IFruit getIFruitInstance(String className) {
		IFruit fruit = null;
		try {
			//Object类  强制转换为   IFruit
			fruit = (IFruit) Class.forName(className).newInstance();
			
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return fruit;
	}
}
/**
 * 一般模式下的工厂设计模式
 * @author 76519
 *
 */
public class TestDemo1 {
	public static void main(String[] args) {
		//new Factory();
		//多态模式  接收数据
		IFruit iFruit = Factory.getIFruitInstance("refelect.factory.Cherry");
		iFruit.eat();
		
	}
}

运行起来没问题,但是好朋友给我提了个问题,你这是只有IFruit的返回类型,如果我有很多种接口,接口下都有子类,如果像你这么写,我是不是要创建很多的工厂类和创建很多的判断,然后判断类型返回指定的实例化对象,不麻烦吗??

作为小白的我不服输,继续琢磨一个更高替代的工厂类,既然有多个接口亦有多个子类,每个都有工厂,所以我们可以选择泛型,看下面的代码。

/**
 * 创建水果类接口
 * 
 * @author 76519
 *
 */
interface IFruit {
	public void eat();
}

class Cherry implements IFruit {
	@Override
	public void eat() {
		System.out.println("吃樱桃....");
	}
}

class Apple implements IFruit {
	@Override
	public void eat() {
		System.out.println("吃苹果....");
	}
}

/**
 * 创建另外的一个 接口 (父类)
 * 
 * @author 76519
 *
 */
interface IMessage {
	public void print();
}

// 创建消息父类的子类对象
class MessageImpl implements IMessage {
	@Override
	public void print() {
		System.out.println("打印信息.....");
	}
}

class Factory {
	// 私有化构造方法 使其不能  实例化
	private Factory() {}

	/**
	 * 创建实例化      工厂方式   ----   泛型模式    
	 * @param className   接收的类名称(全路径)
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getInstance(String className) {
		T t = null;
		try {
			t = (T) Class.forName(className).newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return t;
	}
}

/**
 * 一般模式下的工厂设计模式
 * @author 76519
 *
 */
public class TestDemo2 {
	public static void main(String[] args) {
		// 多态模式 接收数据
		IFruit iFruit = Factory.getInstance("refelect.factory.wonderfull.Cherry");
		iFruit.eat();
		
		// 多态模式   接收消息类
		IMessage iMessage = Factory.getInstance("refelect.factory.wonderfull.MessageImpl");
		iMessage.print();
	}
}

输出信息:

吃樱桃....
打印信息.....

两种接口都是调用同一个工厂类,都可以获取其对应的实例化类,并调用其中的方法。

小伙伴们,是不是很好玩呢,大家如有更好的建议,希望能够提出来,我们共同学习!