泛型抽象工厂通过类型参数统一管理业务实体创建,以TypeRegistry维护抽象类型到具体实现的映射关系,支持命名注册与运行时按名创建,实现解耦与灵活切换。

用一个泛型抽象工厂类,就能把不同业务实体(比如 User、Order、Product)的创建逻辑统一收口,不用为每个实体写一套工厂接口和实现类。
核心思路:用类型参数代替“多套工厂”
传统抽象工厂要为每个产品族定义独立接口(如 IDatabaseFactory、IUIFactory),而泛型工厂把“产品类型”本身作为参数。工厂不再面向“数据库”或“UI”,而是面向任意可实例化的业务类型 T。
- 抽象工厂接口只声明一个泛型方法:
T Create或() T Create(string name) - 注册时绑定
TTarget(抽象/基类)与TSource(具体实现类),例如RegisterType() - 运行时根据类型信息从内部字典(如
IDictionary)查出构造逻辑并执行>
关键结构:类型注册表 + 泛型创建入口
真正起作用的是一个类型映射中心(如 TypeRegistry),它不关心业务含义,只维护“要什么类型 → 用哪个具体类造”的关系:
- 内部用嵌套字典:外层键是抽象类型(
typeof(IUser)),内层键是名称(如"default"或"mock"),值是具体类型的Type对象 -
RegisterType方法负责把() typeof(TSource)存进对应typeof(TTarget)的槽位 -
Create先查() typeof(T)对应的构造器(可能缓存了Activator.CreateInstance委托或表达式树),再调用生成实例
支持多变体:命名注册与运行时选择
同一抽象类型(如 IReportGenerator)可能有多个实现(PdfReportGen、ExcelReportGen、MockReportGen)。泛型工厂通过带名注册支持切换:
factory.RegisterType("pdf") factory.RegisterType("excel") - 调用时指定:
var gen = factory.Create("pdf") - 未传名则走默认注册项(如
RegisterType自动设为() "default")
实际使用示例(C# 风格伪码)
假设你有订单服务需要动态加载不同仓储实现:
- 注册:
factory.RegisterType("sql") - 注册:
factory.RegisterType("mongo") - 使用:
IOrderRepository repo = factory.Create(env == "prod" ? "sql" : "mongo") - 后续所有业务代码都只依赖
IOrderRepository,完全不感知底层变化










