Kotlin设计模式之抽象工厂模式

抽象工厂模式用于创建一组相关或依赖的对象,而无需指定它们的具体类。以下是几种在Kotlin中实现抽象工厂模式的方法:

一. 基本抽象工厂模式

在这种模式中,定义一组产品接口和一个工厂接口,然后实现这些接口。

Kotlin 复制代码
// ProductA.kt
interface ProductA {
    fun use(): String
}

// ProductB.kt
interface ProductB {
    fun use(): String
}

// ConcreteProductA1.kt
class ConcreteProductA1 : ProductA {
    override fun use() = "Using Product A1"
}

// ConcreteProductA2.kt
class ConcreteProductA2 : ProductA {
    override fun use() = "Using Product A2"
}

// ConcreteProductB1.kt
class ConcreteProductB1 : ProductB {
    override fun use() = "Using Product B1"
}

// ConcreteProductB2.kt
class ConcreteProductB2 : ProductB {
    override fun use() = "Using Product B2"
}

// AbstractFactory.kt
interface AbstractFactory {
    fun createProductA(): ProductA
    fun createProductB(): ProductB
}

// ConcreteFactory1.kt
class ConcreteFactory1 : AbstractFactory {
    override fun createProductA(): ProductA = ConcreteProductA1()
    override fun createProductB(): ProductB = ConcreteProductB1()
}

// ConcreteFactory2.kt
class ConcreteFactory2 : AbstractFactory {
    override fun createProductA(): ProductA = ConcreteProductA2()
    override fun createProductB(): ProductB = ConcreteProductB2()
}

二. 使用companion object的抽象工厂

可以使用companion object来实现工厂方法,提供一种静态工厂的实现方式。

Kotlin 复制代码
// Product.kt
interface Product {
    fun use(): String
}

// ConcreteProductA.kt
class ConcreteProductA : Product {
    override fun use() = "Using Product A"
}

// ConcreteProductB.kt
class ConcreteProductB : Product {
    override fun use() = "Using Product B"
}

// AbstractFactory.kt
interface AbstractFactory {
    fun createProduct(type: String): Product
}

// ConcreteFactory.kt
class ConcreteFactory : AbstractFactory {
    companion object {
        fun createFactory(): AbstractFactory = ConcreteFactory()
    }

    override fun createProduct(type: String): Product {
        return when (type) {
            "A" -> ConcreteProductA()
            "B" -> ConcreteProductB()
            else -> throw IllegalArgumentException("Unknown product type")
        }
    }
}

三. 使用sealed class的抽象工厂

sealed class可以用于限制产品类型,从而实现抽象工厂。

Kotlin 复制代码
// SealedProduct.kt
sealed class SealedProduct {
    abstract fun use(): String

    class ProductA : SealedProduct() {
        override fun use() = "Using Product A"
    }

    class ProductB : SealedProduct() {
        override fun use() = "Using Product B"
    }
}

// SealedFactory.kt
object SealedFactory {
    fun createProduct(type: String): SealedProduct {
        return when (type) {
            "A" -> SealedProduct.ProductA()
            "B" -> SealedProduct.ProductB()
            else -> throw IllegalArgumentException("Unknown product type")
        }
    }
}

总结

  • 基本抽象工厂模式:定义多个产品接口和工厂接口,然后实现这些接口。
  • companion object抽象工厂:使用companion object提供静态工厂方法。
  • sealed class抽象工厂:使用sealed class限制产品类型。

根据具体需求选择合适的抽象工厂实现方式。

相关推荐
未秃头的程序猿3 小时前
🚀 设计模式在复杂支付系统中的应用:策略+工厂+模板方法模式实战
后端·设计模式
雨中飘荡的记忆4 小时前
深入理解设计模式之单例模式
java·设计模式
8***29315 小时前
能懂!基于Springboot的用户增删查改(三层设计模式)
spring boot·后端·设计模式
在未来等你14 小时前
AI Agent设计模式 Day 19:Feedback-Loop模式:反馈循环与自我优化
设计模式·llm·react·ai agent·plan-and-execute
兵bing19 小时前
设计模式-访问者模式
设计模式·访问者模式
python零基础入门小白19 小时前
【万字长文】大模型应用开发:意图路由与查询重写设计模式(从入门到精通)
java·开发语言·设计模式·语言模型·架构·大模型应用开发·大模型学习
MC丶科20 小时前
Java设计模式漫画英雄宇宙-工厂模式 —Factory博士的“超级英雄制造机”!
java·设计模式·漫画
明洞日记20 小时前
【设计模式手册013】命令模式 - 请求封装的优雅之道
java·设计模式·命令模式
ada0_ada121 小时前
行为型模式:②命令模式(Command Pattern)
设计模式
o0向阳而生0o1 天前
113、23种设计模式之中介者模式(21/23)
设计模式·中介者模式