设计模式-原型模式(Kotlin)

原型模式就是用一个已创建的实例作为原型,然后通过复制该原型创建一个和原型对象相同的新对象。

原型模式的克隆分为浅拷贝和深拷贝

浅拷贝:创建一个新对象,新对象的属性和原来对象完全相同,而对于非基本数据类型,仍指向原有属性所指向的对象的内存地址

深拷贝:创建一个新对象,所有的东西都会被克隆,包括非基本数据类型

在Kotlin中,数据类(data class)默认提供了该模式,不过在数据类中提供的copy()方法采用的是浅拷贝模式

data class student(val name: String,val banji: banji)
data class banji(val banji: String)

fun main(){
    val st1 = student("liming",banji("二年级三班"))
    val st2 = st1.copy()
    println(st1 === st2) //false
    println(st1.banji===st2.banji) //true
}

但是我们也可以拓展,来写一个深拷贝,具体代码如下

fun <T : Any> T.deepCopy(): T {
    if (!this::class.isData)
        return this  //不是数据类,则直接返回

    //拿到primary构造函数
    return this::class.primaryConstructor!!.let { primaryConstructor->
        primaryConstructor.parameters.map { parameter ->
            val value = (this::class as KClass<T>).memberProperties.first {
                it.name == parameter.name
            }.get(this)
            //当对象也是数据类是进行深拷贝 否则直接返回字段
            if ((parameter.type.classifier as KClass<*>).isData)
                parameter to value?.deepCopy()
            else
                parameter to value
        }.toMap().let (primaryConstructor::callBy )
    }
}

当然也还有其他方法,可以自行搜索

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值