java泛型工厂通过类型注册表、class信息辅助和supplier延迟构造实现类型安全创建,规避类型擦除与强转风险,统一接口收口并支持依赖注入。

Java 中泛型在工厂模式里的通用构建,核心是用类型参数替代硬编码的类判断,避免反射强转风险,同时保持编译期类型安全。关键不在“能不能泛型”,而在于“怎么让泛型真正参与创建逻辑”——靠的是类型注册 + 类型擦除规避 + 运行时 Class 信息辅助。
用类型注册表替代 if-else 分支
原始写法中直接 new StringHandler() 并强制返回 Handler
- 声明一个 Map
, Object> 或更安全的 Map , Supplier>>,把 Class 作为键,构造逻辑作为值 - 注册时明确指定:registry.put(String.class, () -> new StringHandler())
- 获取时先按 Class> 查,再强转 Supplier
>,再调用 get() —— 此时 T 已由调用方确定,类型安全由使用者保障
泛型工厂接口统一收口
定义一个泛型抽象工厂,把“创建什么”交给类型参数,“怎么创建”留给实现:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- interface GenericFactory
{ T create(); } - 每个具体工厂实现它:class StringHandlerFactory implements GenericFactory
> { public Handler create() { return new StringHandler(); } } - 上层可用 FactoryRegistry 统一管理:registry.register(String.class, new StringHandlerFactory())
- 调用时:Handler
h = registry.get(String.class).create()
利用 Class 辅助绕过类型擦除限制
虽然 Java 泛型有类型擦除,但 Class 对象保留了运行时类型信息,可用来做精准匹配和实例化:
- 工厂方法签名设为
Handler getHandler(Class type) - 内部用 type.cast(…),或通过反射调用其无参构造器(需确保 Handler 实现类有 public 无参构造)
- 配合 @SuppressWarnings("unchecked") 是常见且可控的做法,比裸反射更清晰
- 例如:return type == String.class ? (Handler
) new StringHandler() : …
结合 Supplier 和泛型方法实现延迟构造
避免提前实例化、支持依赖注入场景,把构造逻辑封装成 Supplier:
- public class HandlerFactory { private final Map
, Supplier>> handlers = new HashMap(); } - 注册:factory.register(Date.class, () -> new DateHandler(dependencyA, dependencyB))
- 获取:@SuppressWarnings("unchecked") return ((Supplier
>) handlers.get(type)).get() - 这样既解耦了创建时机,又保留了泛型语义和外部类型推导能力
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










