技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

javaでのFactory Methodパターン

Factory MethodパターンはTemplate Methodパターンをオブジェクト生成の場面に適用したもので、オブジェクト生成の処理を共通化することができます。
 
今回は、RPGのキャラクター作成を模したサンプルコードを作成してみました。
キャラクターの職業毎にクラスを分けており、クラス毎に微妙にオブジェクト生成時の処理が異なっていますが、各々のクラスのオブジェクト生成処理を共通化することができています。
 
【サンプルコード】
・AbstractJob.java
import java.util.ArrayList;
import java.util.List;

public abstract class AbstractJob {

    protected String playerName;
    protected List<String> skillList = new ArrayList<String>();

    public abstract void setPlayerName(String playerName);
    public abstract String getPlayerName();
    public abstract void setSkill(String skill);
    public abstract List<String> getSkill();

}
 
・Warrior.java
import java.util.List;

public class Warrior extends AbstractJob {

    public void setPlayerName(String playerName) {
        this.playerName = playerName;
    }

    public String getPlayerName() {
        return this.playerName;
    }

    public void setSkill(String skill) {
        this.skillList.add(skill);
    }

    public List<String> getSkill() {
        return this.skillList;
    }

}
 
・NormalPerson.java
import java.util.List;

public class NormalPerson extends AbstractJob {

    public void setPlayerName(String playerName) {
        this.playerName = playerName;
    }

    public String getPlayerName() {
        return this.playerName;
    }

    public void setSkill(String skill) {
        this.skillList.add(skill);
    }

    public List<String> getSkill() {
        return this.skillList;
    }

}
 
・AbstractJobFactory.java
public abstract class AbstractJobFactory {

    public final AbstractJob create(String playerName) {
        AbstractJob abstractJob = createJob(playerName);
        return abstractJob;
    }

    protected abstract AbstractJob createJob(String playerName);

}
 
・WarriorFactory.java
public class WarriorFactory extends AbstractJobFactory {

    protected AbstractJob createJob(String playerName) {
        Warrior warrior = new Warrior();
        warrior.setPlayerName(playerName);
        warrior.setSkill("QuickSlash");
        return warrior;
    }

}
 
・NormalPersonFactory.java
public class NormalPersonFactory extends AbstractJobFactory {

    protected AbstractJob createJob(String playerName) {
        NormalPerson normalPerson = new NormalPerson();
        normalPerson.setPlayerName(playerName);
        return normalPerson;
    }

}
 
・CreateJobMain.java
import java.util.Iterator;

public class CreateJobMain {
    public static void main(String[] args){

        // Factoryメソッドの定義
        WarriorFactory warriorFactory = new WarriorFactory();
        NormalPersonFactory normalPersonFactory = new NormalPersonFactory();

        // Factoryメソッドによりオブジェクトを生成
        AbstractJob warrior = warriorFactory.create("Player1");
        AbstractJob normalPerson = normalPersonFactory.create("Player2");

        // 生成されたオブジェクトの内容を確認
        displayJob(warrior);
        displayJob(normalPerson);

    }

    private static void displayJob(AbstractJob player) {
        System.out.println("[プレイヤー:"+player.getPlayerName()+"]");
        System.out.println("・職業");
        System.out.println(" "+player.getClass().getName());
        System.out.println("・スキル");
        Iterator<String> iterator = player.getSkill().iterator();
        if (!iterator.hasNext()) {
            System.out.println(" None");
        } else {
            while (iterator.hasNext()) {
                String str = iterator.next();
                System.out.println(" "+str);
            }
        }
    }

}
 
【実行結果】
[プレイヤー:Player1]
・職業
 Warrior
・スキル
 QuickSlash
[プレイヤー:Player2]
・職業
 NormalPerson
・スキル
 None