原型模式就是用一个已创建的实例作为原型,然后通过复制该原型创建一个和原型对象相同的新对象。
原型模式的克隆分为浅拷贝和深拷贝
浅拷贝:创建一个新对象,新对象的属性和原来对象完全相同,而对于非基本数据类型,仍指向原有属性所指向的对象的内存地址
深拷贝:创建一个新对象,所有的东西都会被克隆,包括非基本数据类型
在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 )
}
}
当然也还有其他方法,可以自行搜索