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

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();
	}
}

输出信息:

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_38322527/article/details/81977584