Android Kotlin 设计模式之原型模式
2020-01-20 本文已影响0人
水天滑稽天照八野滑稽石
前言
继续填坑,这次是原型模式
什么是原型模式
首先在java里面是存在深拷贝和浅拷贝的
- 深拷贝: 完全复制生成一个新的对象,修改生成后的对象内容对源对象无影响
- 浅拷贝: 直接引用源对象,修改生成后的对象内容对源对象有影响
而我们常用的 = 本质上就是浅拷贝
@Test
fun test(){
val stu1 = Student("xiao",12)
println("stu1 name:${stu1.name} age:${stu1.age}")
val stu2 = stu1
stu2.name = "da"
stu2.age = 15
println("stu1 name:${stu1.name} age:${stu1.age}")
}
class Student(var name: String,
var age: Int)
除了基本数据类型
@Test
fun test(){
val a = 12
println("a:$a")
var b = a
b = 13
println("a:$a")
}
这个是和java的常量池有关,这个下次再说
所以原型模式就是一个深拷贝来着
如我们Android里面的intent
@Test
fun test00() {
val intent1 = Intent()
intent1.putExtra("xiao","xiao")
val intent2 = intent1.clone() as Intent
intent2.putExtra("da","da")
println("intent1 da:${intent1.getStringExtra("da")}")
}
正文
写原型模式的话在kotlin里面有以下2种写法
- 实现cloneable接口并重写clone方法
@Test
fun test(){
val stu1 = Student("xiao",12)
println("stu1 name:${stu1.name} age:${stu1.age}")
val stu2 = stu1.clone()
stu2.name = "da"
stu2.age = 15
println("stu1 name:${stu1.name} age:${stu1.age}")
}
class Student(var name: String,
var age: Int) : Cloneable{
public override fun clone(): Student {
return super.clone() as Student
}
}
- 使用data关键字
@Test
fun test(){
val stu1 = Student("xiao",12)
println("stu1 name:${stu1.name} age:${stu1.age}")
val stu2 = stu1.copy()
stu2.name = "da"
stu2.age = 15
println("stu1 name:${stu1.name} age:${stu1.age}")
}
data class Student(var name: String,
var age: Int)