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