May 05, 2003

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)  b_entry.gif
トラックバック [1件]
TrackBack URL: http://mt.bloghackers.net/mt/suck-tbspams.cgi/62
dog sex
Excerpt: bestiali...
Weblog:
Tracked: January 7, 2006 02:38 PM
コメント [0件]