1. 概述

抽象工厂(Abstract Factory)是一种创建型设计模式,它的核心目标是为一组具有相同主题的关联对象提供一个统一的创建接口,同时隐藏具体的实现细节。✅
该模式在工厂方法模式的基础上再增加一层抽象,使得对象的创建更加灵活和可扩展。

本文将介绍如何在 Kotlin 中高效地实现抽象工厂模式,并结合实战示例帮助理解其应用场景与优势。

2. 抽象工厂模式的核心结构

抽象工厂属于创建型设计模式,主要作用是将具有共同主题的对象创建过程封装到独立的工厂类中,从而解耦客户端与具体实现。每个工厂负责创建一整套相关或依赖的对象族。

核心组成要素:

  • 抽象工厂(Abstract Factory):定义创建一系列抽象产品的方法接口
  • 具体工厂(Concrete Factory):实现抽象工厂接口,负责创建具体的产品实例
  • 抽象产品(Abstract Product):定义某一类产品对象的接口(如武器、引擎等)
  • 具体产品(Concrete Product):实现抽象产品的具体类
  • 客户端(Client):通过抽象工厂和抽象产品接口来使用对象,不直接依赖具体实现

下图展示了抽象工厂的典型结构:

AbstractFactory 1

⚠️ 注意:这种模式适用于需要“成套”创建对象的场景,比如不同风格的 UI 组件(按钮+文本框)、不同系列的游戏装备等。


3. Kotlin 中的实际实现

我们以“武器系统”为例,假设游戏中有多种类型的武器家族(弓弩、刀剑),每种武器都由对应的工厂创建。

第一步:定义抽象产品接口

所有武器都需要具备基本行为,这里我们定义一个 Weapon 接口:

interface Weapon {
    fun use(): String
}

第二步:定义抽象工厂

接下来定义一个抽象工厂基类,用于规范武器的构建流程:

abstract class WeaponFactory {
    abstract fun buildWeapon(): Weapon
}

第三步:使用 Companion Object 实现具体工厂

Kotlin 的 companion object 特性非常适合实现工厂模式——它允许我们在类内部声明静态工厂对象,语法简洁且语义清晰。

示例 1:十字弓(Crossbow)

class Crossbow : Weapon {

    companion object Factory : WeaponFactory() {
        override fun buildWeapon() = Crossbow()
    }

    override fun use(): String {
        return "Using crossbow weapon"
    }
}

示例 2:武士刀(Katana)

class Katana : Weapon {

    companion object Factory : WeaponFactory() {
        override fun buildWeapon() = Katana()
    }

    override fun use(): String {
        return "Using katana weapon"
    }
}

✅ 小技巧:利用 companion object 不仅避免了额外的工厂类文件,还能让调用方直观地知道 Katana.Factory 是创建 Katana 的标准方式,提升了代码可读性。

第四步:客户端使用方式

现在我们可以完全基于抽象接口进行编程:

val factory: WeaponFactory = Crossbow.Factory
val crossbow = factory.buildWeapon()

assertNotNull(crossbow)
assertEquals("Using crossbow weapon", crossbow.use())

如果要切换成其他武器,只需更换工厂实现即可,无需修改客户端逻辑,完美体现“开闭原则”。


4. 抽象工厂的优势与权衡

虽然抽象工厂会引入一定的复杂度(❌ 类数量增多,初期理解成本略高),但在合适场景下优势明显:

松耦合:客户端只依赖抽象接口,不与具体类紧耦合,便于替换和测试
统一创建入口:对象的生成逻辑集中管理,维护更方便
符合开闭原则:新增产品族时(如添加“魔法杖”系列),只需新增具体工厂和产品类,不影响现有代码
支持产品族一致性控制:确保同一工厂产出的对象属于同一系列(比如都是东方风格 or 都是未来科技风)

⚠️ 踩坑提醒:不要为了套用模式而滥用抽象工厂!如果只有一种产品类型或未来几乎不会扩展,直接用简单工厂 + 工厂方法就够了,过度设计反而增加维护负担。


5. 总结

本文通过一个游戏武器系统的例子,演示了如何在 Kotlin 中优雅地实现抽象工厂模式。借助 companion object 的特性,我们既能保持代码简洁,又能充分发挥设计模式的灵活性。

抽象工厂特别适合以下场景:

  • 需要创建一组相关或依赖的对象族
  • 系统需支持多套实现方案并能自由切换(如多皮肤 UI、多语言资源包)
  • 强调解耦与可扩展性的模块设计

最后,本文完整示例代码已托管至 GitHub:https://github.com/Baeldung/kotlin-tutorials/tree/master/core-kotlin-modules/core-kotlin-design-patterns
欢迎 clone 学习或集成进你的项目中作为参考模板。


原始标题:Abstract Factory Pattern in Kotlin