『増補改訂版Java言語で学ぶデザインパターン入門』をKotlinでやってみる(Singleton編)


【経緯】

『増補改訂版Java言語で学ぶデザインパターン入門』をKotlinでやってみるの第四回目。
Singletonパターンです。

【サンプルコード】

Singletonは割と多くの人が知っている&使っているイメージです。
Singletonはインスタンスが1つしか存在しないことを保証するパターンです。
良くシステムを通して共通するものの管理に使っているイメージがあります。
ゲーム作成ではお馴染みですね。自分も最初に知ったのはテトリス作ってる時でした。
ただ、そもそもKotlinにstaticがないらしいので、自作Singletonする必要があるのかとか実装自体は結構やり辛かったです。
まあKotlinが用意してくれてるものを使えばそんなに困らないからだろうが・・・。
※今回はpaiza.ioさんでやってみました。便利。

Main.kt
 fun main(args: Array<String>) {
    // Here your code !
    println("Start")

    var obj1 = Singleton.getInstance()
    var obj2 = Singleton.getInstance()

    if (obj1 === obj2) {
        println("同じインスタンスです")
    } else {
        println("違うインスタンスです")
    }
    println("End")
}
Singleton.kt
public object Singleton {
    init {
        println("インスタンスを作成しました")
    }

    public fun getInstance() {
        println("インスタンスを取得しました")
    }
}
出力結果
Start
インスタンスを作成しました
インスタンスを取得しました
インスタンスを取得しました
同じインスタンスです
End

【練習問題コード】

※1問目と2問目合わせてです。2問目については一応巻末のコードと同じ動きはしますが、自信ないです。。

Main.kt
 fun main(args: Array<String>) {
    // Here your code !
    println("Start")

    var ticket1 = TicketMaster.getInstance()
    var ticket2 = TicketMaster.getInstance()

    println("1:" + ticket1.getNextTicketNumber())
    println("2:" + ticket2.getNextTicketNumber())

    if (ticket1 === ticket2) {
        println("同じインスタンスです")
    } else {
        println("違うインスタンスです")
    }
    println("End")

    var triple = Triples.getInstance(0)
    for (i in 0..8) {
        println(Triples.getNumber(i%3))
    }
}
TicketMaster.kt
public object TicketMaster {

    fun getInstance():TicketMaster {
        return TicketMaster
    }

    private var number:Int = 1000;
    public fun getNextTicketNumber():Int {
        return ++number;
    }
}
Triples.kt
public class Triples(index:Int) {
    public var  number:Int=index
    private fun getNumber(index:Int):Int {
        return number
    }
    companion object {
        var triples = arrayOf(Triples(0), Triples(1), Triples(2))
        public fun getInstance(index:Int):Triples {
            return triples.get(index)
        }

        public fun getNumber(index:Int):Int {
            return triples[index].getNumber(index)
        }
    }
}
出力結果
Start
1:1001
2:1002
同じインスタンスです
End
0
1
2
0
1
2
0
1
2

【参考サイト】

https://yyyank.blogspot.com/2017/03/kotlinstaticwhy-doesnt-kotlin-have.html
http://k-seito.hatenablog.com/entry/2017/10/22/100823
https://android.benigumo.com/20170810/kotlin-static-member/
https://qiita.com/zhangho/items/2de7e4836e9b2bcf6353