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();
}
}
输出信息:
吃樱桃....
打印信息.....
两种接口都是调用同一个工厂类,都可以获取其对应的实例化类,并调用其中的方法。
小伙伴们,是不是很好玩呢,大家如有更好的建议,希望能够提出来,我们共同学习!
上一篇: static
下一篇: 去掉字符串头尾指定字符