博客
关于我
你会用Kotlin实现构建者模式吗?
阅读量:344 次
发布时间:2019-03-04

本文共 3629 字,大约阅读时间需要 12 分钟。

构建者模式在Kotlin中的应用与比较

构建者模式在软件开发中是一个非常实用的创建型设计模式。它通过封装复杂的对象创建逻辑,使得开发者能够一步步构建复杂对象。在Java世界中,构建者模式(Builder Pattern)被广泛应用于处理复杂对象的创建任务,尤其是在需要多步配置的情况下。然而,当Kotlin(一个受Java启发的静态标签语言)横空出世后,很多人认为构建者模式在Kotlin中已经不再有用。这种说法是否正确呢?让我们深入探讨一下。

默认参数与名称参数:Kotlin的强大之处

Kotlin引入了默认参数和名称参数的概念,使得在大多数情况下无需使用构建者模式即可完成对象创建任务。默认参数允许开发者在调用构造函数时,只需提供需要修改的参数值,而其他参数则使用默认值;而名称参数则让开发者可以直接指定需要修改的属性。

例如,以下是一个简单的Computer类:

class Computer(    val cpu: String = "英特尔",    val ram: String = "金士顿",    val usbCount: Int = 2,    val keyboard: String = "罗技",    val display: String = "京东方") {    override fun toString(): String {        return "Computer(cpu='$cpu', ram='$ram', usbCount=$usbCount, keyboard='$keyboard', display='$display')"    }}

调用时可以这样使用:

val computer = Computer(    ram = "海力士",    keyboard = "双飞燕")

通过名称参数可以灵活设置需要修改的属性,其他属性使用默认值即可。这确实大大简化了对象创建的代码,展现了Kotlin的强大之处。

构建者模式在Kotlin中的应用

尽管Kotlin的默认参数和名称参数可以在大多数情况下替代构建者模式,但构建者模式在某些场景下仍然有其独特的优势。例如,当一个对象需要经过多步配置才能完成创建时,构建者模式可以帮助我们在每一步完成配置而不暴露内部状态,从而保证对象的不可变性。

第一种写法:传统的构建者模式

Kotlin中可以通过传统的方式实现构建者模式。具体步骤如下:

  • 封装构造函数:创建一个私有的无参数构造函数,用于接收构建者模式下的配置。

  • 创建构建者类:定义一个内部类Builder,它包含所有需要配置的属性,并提供设置方法。

  • 实现可应用性:使用apply函数在设置方法中对属性进行批量设置。

  • 实现构建逻辑:在Builder类中添加一个build方法,用于最终创建目标对象。

  • 例如,以下是一个完整的Computer类:

    class Computer1 private constructor(    val cpu: String,    val ram: String,    val usbCount: Int,    val keyboard: String,    val display: String) {    private constructor(builder: Builder) : this(        builder.cpu,        builder.ram,        builder.usbCount,        builder.keyboard,        builder.display    )    class Builder {        var cpu: String = ""            private set        var ram: String = ""            private set        var usbCount: Int = 0            private set        var keyboard: String = ""            private set        var display: String = ""            private set        fun setCpu(inputCpu: String) = apply {            this.cpu = inputCpu        }        fun setRam(inputRam: String) = apply {            this.ram = inputRam        }        fun setUsb(inputUsb: Int) = apply {            this.usbCount = inputUsb        }        fun setKeyboard(inputKeyboard: String) = apply {            this.keyboard = inputKeyboard        }        fun setDisplay(inputDisplay: String) = apply {            this.display = inputDisplay        }        fun build() = Computer1(this)    }    override fun toString(): String {        return "Computer(cpu='$cpu', ram='$ram', usbCount=$usbCount, keyboard='$keyboard', display='$display')"    }}

    第二种写法:更简洁的构建者模式

    Kotlin提供了一种更加简洁的构建者模式实现方式,通过companion objectinline函数来实现更紧凑的代码结构。

    class Computer3 private constructor(    val cpu: String,    val ram: String,    val usbCount: Int,    val keyboard: String,    val display: String) {    companion object {        inline fun build(block: Builder.() -> Unit) = Builder().apply(block).build()    }    class Builder {        var cpu: String = ""            private set        var ram: String = ""            private set        var usbCount: Int = 0            private set        var keyboard: String = ""            private set        var display: String = ""            private set        fun build() = Computer3(this)    }}

    通过companion objectinline函数,我们可以在非常简洁的代码中实现构建者模式。调用方式如下:

    val computer3 = Computer3.build {    setCpu("AMD")    setRam("海力士")    setDisplay("三星")    setUsb(3)    setKeyboard("双飞燕")}

    这种写法不仅更简洁,而且提供了更灵活的调用方式,完全可以与传统的构建者模式写法并存。

    总结

    在Kotlin中,大多数情况下默认参数和名称参数已经可以很好地替代构建者模式。然而,构建者模式在以下场景下仍然具有其独特的优势:

  • 多步骤配置:当一个对象需要经过多个步骤才能完成构建时,构建者模式可以帮助我们在每一步完成配置,而不暴露对象的内部状态。

  • 不可变性:通过构建者模式,我们可以确保在每一步配置后,对象的状态是不可变的,这有助于减少潜在的错误。

  • 灵活性:构建者模式提供了高度的灵活性,可以根据具体需求定制构建逻辑。

  • 因此,虽然Kotlin的默认参数和名称参数非常强大,但构建者模式在某些特定场景下仍然具有不可替代的优势。

    转载地址:http://amee.baihongyu.com/

    你可能感兴趣的文章
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim教程【十二】
    查看>>