抽象类不能被实例化,但可通过静态工厂方法返回其具体子类实例,隐藏实现细节、提升封装性与可扩展性;工厂方法返回抽象类型,内部按参数选择子类,调用方无需知晓实际类型。

抽象类本身不能被实例化,但可以通过静态工厂方法返回其具体子类的实例,从而对外隐藏实现细节、提升封装性与可扩展性。关键在于:工厂方法返回抽象类型,内部根据参数或上下文选择并创建具体子类,调用方完全无需知道实际类型。
设计抽象基类并定义统一接口
先明确抽象类要暴露的行为契约,把共性逻辑上提到抽象类(可含默认实现),把差异化部分声明为抽象方法或由子类决定:
- 用 abstract class 定义基类,不暴露构造器(设为 protected 或包私有)
- 所有公共能力通过 public final 方法或 public abstract 方法暴露
- 避免在抽象类中暴露子类特有字段或方法,确保调用方只依赖抽象类型
在抽象类中声明静态工厂方法
工厂方法是静态的、返回抽象类型、参数体现业务语义(如配置名、数据格式、场景标识),不暴露 new 子类的操作:
- 方法签名形如 public static AbstractType create(String type) 或 create(Options opts)
- 内部用 if-else 或 switch(Java 14+ 可用 switch 表达式)分发到对应子类构造
- 可结合 ServiceLoader 或 Map 缓存子类 Supplier 实现动态扩展,避免硬编码
- 示例:// 返回的是抽象类类型,调用方无法得知是 JsonParserImpl 还是 XmlParserImpl
子类仅提供必要构造逻辑,不对外暴露
具体子类应尽可能精简,只实现抽象类要求的抽象方法,构造器设为 package-private 或 protected:
- 禁止 public 构造器——防止外部直接 new,破坏封装
- 子类名不体现业务语义(如不用 FastJsonParser,而用 JsonParserImpl),避免调用方产生依赖倾向
- 若需初始化参数,由工厂方法统一接收并传递,子类不自行解析配置
配合构建器或参数对象提升可读性与健壮性
当创建逻辑复杂、参数较多时,避免长参数列表,改用 Builder 模式或不可变参数对象:
- 静态工厂可重载多个方法,如 createForWeb()、createForBatch(),内部委托给统一构造流程
- 引入 ParserOptions 类封装格式、超时、编码等配置,工厂方法只接收该对象
- 工厂内做参数校验(如 type 非空、format 合法),失败时抛出有意义的运行时异常(如 IllegalArgumentException)

















