文章目錄
- 委托和代理
- 單例
委托和代理

我們建立一個IWashBowl接口,裡邊有一個洗碗的方法
interface IWashBowl {
fun washing()
}
現在有大頭兒子和小頭爸爸,大頭兒子洗碗賺1塊錢,小頭爸爸賺10塊錢
class BigHeadSon:IWashBowl {
override fun washing(){
println("我是大頭兒子,我洗碗賺1塊錢")
}
}
class SmallHeadFather:IWashBowl {
override fun washing(){
println("我是小頭爸爸,我洗碗賺10塊錢")
}
}
測試代碼
fun main(args: Array<String>) {
var son = BigHeadSon()
son.washing()
var father = SmallHeadFather()
father.washing()
}
、
那麼什麼是代理和委托呢,拿上邊的例子來說明,當小頭爸爸再有洗碗任務時,可以讓大頭兒子來洗,我們小頭爸爸的代碼
class SmallHeadFather:IWashBowl by BigHeadSon() {
}
寫測試代碼
fun main(args: Array<String>) {
var father = SmallHeadFather()
father.washing()
}
SmallHeadFather中也是可以重寫
class SmallHeadFather:IWashBowl by BigHeadSon() {
override fun washing(){
println("我是小頭爸爸,我看着大頭兒子洗碗")
BigHeadSon().washing()
println("最終我還是賺了10塊錢")
}
}
再次運作
單例
其實上邊的代碼是有瑕疵的,小頭爸爸的
BigHeadSon().washing()
會建立出了一個大頭兒子,如果測試代碼中已經有
var son = BigHeadSon()
的話,就有2個大頭了
var a = BigHeadSon();
var b = BigHeadSon();
println(a == b)
是以我們需要用到單例,先展示 Java 常見寫法
public class Singleton{
private static Singleton instance;
private Singleton(){}
public synchronized static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
public void singletonTest(){
System.out.println("singletonTest is called");
}
}
調用單例中方法時,
Singleton singleton = Singleton.getInstance();
singleton.singletonTest();
在Kotlin 中建立單例十分簡單,隻要把關鍵字
class
改為
object
。我們來用 Kotlin 建立一個單例
object Singleton {
fun singletonTest(){
println("singletonTest is called")
}
}
調用單例類中的函數也很簡單
Singleton.singletonTest();
下面修改 之前的栗子
object BigHeadSon:IWashBowl {
override fun washing(){
println("我是大頭兒子,我洗碗賺1塊錢")
}
}
小頭爸爸的代碼也需要修改,把小括号即可,代表我們不需要重新建立BigHeadSon了,并且大頭兒子在記憶體中有且僅有一個
class SmallHeadFather:IWashBowl by BigHeadSon {
override fun washing(){
println("我是小頭爸爸,我看着大頭兒子洗碗")
BigHeadSon.washing()
println("最終我還是賺了10塊錢")
}
}
var a = BigHeadSon;
var b = BigHeadSon;
println(a == b)