java中可用hashmap实现轻量级工厂注册表,以字符串或class为key、supplier为value存储创建逻辑,支持运行时注册与类型安全获取,零依赖且比反射更安全。

在 Java 中,可以用 HashMap 实现一个轻量级的工厂注册表(Registry-based Factory),核心思路是:把类名或类型标识作为 key,把对应的对象创建逻辑(如 Supplier、Class、或工厂方法)作为 value 存入 Map;使用时根据 key 查找并触发创建逻辑。
定义统一的工厂接口或函数式接口
为了类型安全和可扩展性,建议定义一个通用的创建接口,比如:
public interface ObjectFactory<t> {
T create();
}</t>
或者直接用 JDK 自带的 Supplier<t></t> —— 更简洁,推荐:
- 避免自定义接口的冗余
- 与 Stream、Optional 等天然兼容
- Lambda 表达式写法直观,例如
() -> new UserServiceImpl()
用 HashMap 存储类型标识与创建逻辑的映射
声明一个静态或单例的 HashMap<string supplier>></string>,用于注册和查找:
public class SimpleFactoryRegistry {
private static final Map<string supplier>> registry = new HashMap();
public static void register(String key, Supplier<object> factory) {
registry.put(key, factory);
}
@SuppressWarnings("unchecked")
public static <t> T getInstance(String key) {
Supplier<object> factory = registry.get(key);
if (factory == null) {
throw new IllegalArgumentException("No factory registered for key: " + key);
}
return (T) factory.get();
}
}</object></t></object></string>
说明:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- key 可以是业务类型名(如
"user"、"payment"),也可以是全限定类名 - value 是延迟执行的创建逻辑,支持无参构造、依赖注入模拟、甚至带简单参数的闭包(需封装)
- 泛型转型加
@SuppressWarnings("unchecked")是常见折中;更严谨可用Class<t></t>作 key 或引入类型令牌
注册与使用示例
在应用启动时(如 static 块、Spring @PostConstruct、或 main 方法中)注册:
// 注册
SimpleFactoryRegistry.register("user", () -> new UserServiceImpl());
SimpleFactoryRegistry.register("order", () -> new OrderService(new PaymentClient()));
// 使用
UserService userService = SimpleFactoryRegistry.getInstance("user");
OrderService orderService = SimpleFactoryRegistry.getInstance("order");
优点:
- 零第三方依赖,纯 JDK 实现
- 解耦了对象创建与调用方,支持运行时动态注册(比如插件场景)
- 比反射调用更安全(无
ClassNotFoundException/IllegalAccessException风险)
可选增强:支持泛型类型擦除规避
如果需要按真实类型(而非字符串)查找,可用 Class<t></t> 作 key:
private static final Map<class>, Supplier<object>> typeRegistry = new HashMap();
public static <t> void register(Class<t> type, Supplier<t> factory) {
typeRegistry.put(type, factory);
}
public static <t> T getInstance(Class<t> type) {
Supplier<object> factory = typeRegistry.get(type);
if (factory == null) throw new IllegalArgumentException(...);
return type.cast(factory.get());
}</object></t></t></t></t></t></object></class>
调用方式变为:
SimpleFactoryRegistry.register(UserService.class, () -> new UserServiceImpl()); UserService service = SimpleFactoryRegistry.getInstance(UserService.class);
这样避免字符串硬编码,编译期更健壮。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










