ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

Abstract Factory その2

具体的なクラスを指定せずに、インスタンスを生成することができるのがこのパターン。
例によってゲームで考えてみる。
抽象的な製品であるEnemy。

package factory;

public abstract class Enemy {
    public abstract void Message();
}

抽象的な工場であるFactory。このgetFactoryで指定された名前のクラスを生成している。

package factory;

public abstract class Factory {
    public static Factory getFactory(String classname) {
        Factory factory = null;
        try {
            factory = (Factory)Class.forName(classname).newInstance();
        } catch(ClassNotFoundException e) {
            System.err.println( classname + " not found.");
        } catch(Exception e) {
        }
        return factory;
    }
    public abstract Enemy createEnemy();
}

テストするためのメインプログラム。実行するとき引数にクラス名を指定する。

import factory.*;

public class Main {
    public static void main(String[] args) {
        Factory factory = Factory.getFactory(args[0]);

        Enemy enemy = factory.createEnemy();
        enemy.Message();
    }
}

ここまで具体的な製品や工場が一切出てこない。メインプログラムでは具体的な名前が分からなくても実行できる。次から具体的なもの。
ゴブリンの具体的な製品と工場

package goblinfactory;
import factory.*;

public class Goblin extends Enemy {
    public void Message() {
        System.out.println("Goblin.");
    }
}

public class GoblinFactory extends Factory {
    public Enemy createEnemy() {
        return new Goblin();
    }
}

スライムの具体的な製品と工場

package slimefactory;
import factory.*;

public class Slime extends Enemy {
    public void Message() {
        System.out.println("Slime.");
    }
}

public class SlimeFactory extends Factory {
    public Enemy createEnemy() {
        return new Slime();
    }
}

実行するときにこの敵の工場名を渡すことによって、敵を作り出すことが出来る。プログラムは今回、Javaで作成し実行できることを確認した。このサンプルでは製品はあるけど、部品が無いのであんまりいい例とはいえない。


参考文献:Java言語で学ぶデザインパターン入門
参考:
ギコ猫とAbstract Factoryパターン
Abstract Factory パターン - Wikipedia