LoginSignup
3
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-09-05

【経緯】

『増補改訂版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

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1