Warcraft3でデザインパターン: Factory Method
[ Java ]
第二回目は Factory Method。Orc の Worker は Great Hall から、Human の Worker は Town Hall からそれぞれ作るので、それを Factory Method で実現してみる。
まず Creator と Product として、それぞれ Factory.java と Worker.java を実装する。
package factory_method;
public abstract class Factory {
public final Worker create() {
Worker w = createWorker();
registerWorker(w);
return w;
}
protected abstract Worker createWorker();
protected abstract void registerWorker(Worker w);
protected abstract int getWorkerNum();
}
package factory_method;
abstract public class Worker {
public abstract void lumberjack();
public abstract void mine();
}
ConcreteCreator と ConcreteProduct は、まず Human を想定してそれぞれ TownHall.java、Peasant.java として実装。
package factory_method;
import java.util.*;
public class TownHall extends Factory {
private Vector pool;
public TownHall() {
pool = new Vector();
}
protected Worker createWorker() {
return new Peasant();
}
protected void registerWorker(Worker w) {
pool.add(w);
}
protected int getWorkerNum() {
return pool.size();
}
}
package factory_method;
public class Peasant extends Worker {
public void lumberjack() {
System.out.println("Peasant: 木を切ります");
}
public void mine() {
System.out.println("Peasant: 金を掘ります");
}
}
次に Orc の場合の ConcreteCreator に GreatHall.java、ConcreteProduct に Peon.java を実装する。
public class GreatHall extends Factory {
private List pool;
public GreatHall() {
pool = new ArrayList();
}
protected Worker createWorker() {
return new Peon();
}
protected void registerWorker(Worker w) {
pool.add(w);
}
protected int getWorkerNum() {
return pool.size();
}
}
package factory_method;
public class Peon extends Worker {
public void lumberjack() {
System.out.println("Peon: 木を切るよ");
}
public void mine() {
System.out.println("Peon: 金を掘るよ");
}
}
ようやくすべて揃ったので、Main.java で使ってみる。
package factory_method;
public class Main {
public static void main(String[] args) {
Factory f1 = new GreatHall();
Worker w1 = f1.create();
w1.lumberjack();
w1.mine();
Factory f2 = new TownHall();
Worker w2 = f2.create();
w2.lumberjack();
w2.mine();
for (int i = 0; i < 10; i++) {
f2.create();
}
System.out.println("ワーカーの数: " + f2.getWorkerNum());
}
}
実行結果は以下。GreaterHallでcreateすればPeonインスタンスが、TownHallでcreateすればPeasantインスタンスが得られる。Main.javaにはPeon、Peasantのクラス名は出てこないので、それらのクラスの独立性が高まっている。
Peon: 木を切るよ
Peon: 金を掘るよ
Peasant: 木を切ります
Peasant: 金を掘ります
ワーカーの数: 11
Posted by naoya at May 5, 2003 12:17 PM
| トラックバック (1)