重温java知识(三十五、反射机制之四:反射机制与工厂设计模式)
程序员文章站
2022-03-09 20:30:02
...
传统的工厂设计操作中会存在两个严重的问题:
- 问题1:传统工厂设计属于静态工厂设计,需要根据传入的参数并结合大量的分支语句来判断所需要实例化的子类,当一个接口或抽象类扩充子类时必须修改工厂类接口,否则将无法获取新的子类实例。
- 问题2:工厂设计只能够满足一个接口或抽象类获取实例化对象的需求,如果有更多的接口或抽象类定义时将需要定义更多的工厂类或扩充工厂类中的static方法。
1、反射与工厂设计模式的例子:
package com.mydemo;
public class ReflectionMechanismDemo {
public static void main(String[] args) throws Exception {
/**
* 结合反射机制与泛型获取指定类型的实例,
* 这样可以避免向下转型所带来的安全隐患。
*/
IMessage cloudMessage = Factory.getInstance("com.mydemo.CloudMessage", IMessage.class);
IMessage netMessage = Factory.getInstance("com.mydemo.NetMessage", IMessage.class);
cloudMessage.send();
netMessage.send();
}
}
// 定义接口
interface IMessage {
public void send(); // 消息发送
}
class CloudMessage implements IMessage {
@Override
public void send() {
System.out.println("【云消息】---");
}
}
class NetMessage implements IMessage {
@Override
public void send() {
System.out.println("【网络消息】---");
}
}
class Factory {
// 避免产生实例化对象
private Factory() {
}
/**
* 获取接口实例化对象
*
* @param className 实例化对象名称
* @param clazz 返回实例化对象类型
* @param <T>
* @return 如果子类存在则返回指定接口实例化对象,否则返回null
*/
@SuppressWarnings("unchecked")
public static <T> T getInstance(String className, Class<T> clazz) {
T instace = null;
try {
// 根据传入的完整类名称获取指定类的实例化对象
instace = (T) Class.forName(className).getDeclaredConstructor().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return instace;
}
}
运行结果:
【云消息】---
【网络消息】---