四畳半の秘密基地

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

MENU

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

昨日前夜祭で久しぶりのスプラトゥーンを満喫してました。
エイムも操作もひどいことになってました。
しばらくはリハビリ期間になりそうです・・・

Factory Methodパターンとは

Factory Methodパターンは、インスタンスの作り方をスーパークラスで定め、実際にインスタンス化する処理はサブクラスに分けて実装するパターンです。
今回は、サーモンランの敵を題材にしました。登場から攻撃までの処理を実装します。

実装

まず枠組みとなるスーパークラスを2つ定義します。
Factory.kt

abstract class Factory {
    fun create() : Enemy {
        var enemy = createEnemy()
        deployToMap(enemy)
        return enemy
    }

    abstract fun createEnemy() : Enemy
    abstract fun deployToMap(enemy: Enemy)
}

Enemy.kt

abstract class Enemy {
    abstract fun attack()
    abstract fun move()
    abstract fun appear()
}

Factoryでは生成してからマップに配置するまでの処理を行なっています。
次に具象クラスです。バクダンという敵をインタンス化します。

BakudanFactory.kt

class BakudanFactory : Factory() {
    override fun createEnemy(): Enemy {
        return Bakudan()
    }

    override fun deployToMap(enemy: Enemy) {
        enemy.appear()
    }

}

Bakudan.kt

class Bakudan : Enemy() {
    override fun attack() {
        println("爆弾を発射!")
    }

    override fun move() {
        println("ちょっと移動")
    }

    override fun appear() {
        println("バクダンが現れた!")
    }

}

実行結果

バクダンが現れた!
ちょっと移動
爆弾を発射!

感想

参考書の例では1製品1工場で作られていたのですが、複数製品があったらどうするのか疑問です。スプラトゥーンのサーモンランではオオモノシャケという敵が複数種類います。今回はバクダン専用のFactoryクラスを作りましたが、コウモリやモグラなどを追加する場合は別でFactoryクラスを作った方がいいのかなぁ。個人的にはEnemyFactoryを作ってそこに全ての敵のインスタンス化を押し込んでしまいたい気持ちになります。謎は深まるばかり・・・