四畳半の秘密基地

さあ、今日はどんな実験をしよう

MENU

Kotlinとスプラトゥーンで学ぶデザインパターン【5. Singleton】

最近チャージャーに限界を感じてきました。特にガチホコだと思わぬ奇襲を受けやすいです。
奇襲に対処できるチャージャーになりたい。


Singleton パターンとは

Singletonとは対象のクラスが絶対に1つしか存在しないことを保証するデザインパターンです。
今回は、ダウニーの上位互換ことスパイキーをSingletonパターンで表現してみました。
スパイキーはゲソタウンで指定したギアの受け取りをしてくれます。
当たり前ですが、スパイキーは一人(匹?)しかいないです。
複数いたらどのスパイキーからギアを受け取ればいいかわからなくなりますね。


実装

Spiky.kt

class Spiky {

    private constructor() {}

    var delivery: Delivery? = null

    companion object {
        val spiky = Spiky()
        fun getInstance(): Spiky {
            return spiky
        }
    }

    fun receiveDelivery(delivery: Delivery) {
        this.delivery = delivery
    }

    fun requestReceiveOrder() {
        delivery?.let { println(it.name + "が届いてるぜ!") }
                ?: println("そんなものはない")
    }
}

まずはスパイキークラス。コンストラクタをプライベートにして外部からインスタンス化できないようにして、
インスタンスはクラス内で生成しgetInstanceで渡すようにしてます。
あとは配達物が届いてるか判定して文字を出力します。セリフは雑です。


Delivery.kt

data class Delivery(val id: Int, val name: String)

配達物のデータクラスです。良い英語が思いつかなかった・・・


Main.kt

val spiky = Spiky.getInstance()
spiky.requestReceiveOrder()

spiky.receiveDelivery(Delivery(1, "ガチガサネ"))

val spiky2 = Spiky.getInstance()
spiky2.requestReceiveOrder()

スパイキーを2回生成するようにして同じインスタンスを参照できているか確認します。
インスタンスであればspikey2には配達物が届いてないことになります。


実行結果

そんなものはない
ガチガサネが届いてるぜ!

2回目のリクエストで配達物が届いていたので中のインスタンスは同じようです。


感想

配達物の判定を最初、null判定で表示してたのですが、letを使用したら括弧のdeliveryがnullでないことを保証できたので
letを使いました。赤べこ本で知識として知ってはいたものの使いどころがわかってないですね。
IDEパイセンが気づかせてくれました。ありがとうIntelliJ IDEA!