当前位置: 首页 > article >正文

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来实现工厂方法,提供一种静态工厂的实现方式。

// 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可以用于限制产品类型,从而实现抽象工厂。

// 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限制产品类型。

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


http://www.kler.cn/a/429198.html

相关文章:

  • JavaEE之CAS
  • XML在线格式化 - 加菲工具
  • VS Code--常用的插件
  • 从 SQL 语句到数据库操作
  • leetcode 面试经典 150 题:汇总区间
  • 51单片机——DS18B20温度传感器
  • Linux C/C++如何处理两个静态库相互依赖的问题
  • Vulkan 开发(十二):Vulkan 渲染通道
  • 3D 生成重建026-Wonder3D单视图3d生成
  • 2024.12.6——攻防世界PHP2
  • 2024年11月中国及周边部分亚洲国家干旱情况的监测报告
  • Linux下redis环境的搭建
  • pushgateway HA高可用方案
  • YOLOv8实战道路裂缝缺陷识别
  • 唯一索引、普通索引的使用场景
  • “Flash闪存”基础 介绍及 雷龙电子“CSNP32GCR01-AOW”产品的测试
  • 【Linux】基础IO-----文件详解
  • NeurIPS Spotlight|从分类到生成:无训练的可控扩散生成
  • WiFi近源攻击实战(精)
  • 23种设计模式之策略模式
  • springSecurity权限控制
  • 机器学习最简单的分类任务入门
  • AI时代的开发新纪元:云开发 Copilot
  • 字符串的连接C语言(pta)
  • 基于单片机和测频法的频率计设计及proteus仿真
  • learn-(Uni-app)uni.navigateTo方法进行页面跳转