Factory MethodパターンはTemplate Methodパターンをオブジェクト生成の場面に適用したもので、オブジェクト生成の処理を共通化することができます。
今回は、RPGのキャラクター作成を模したサンプルコードを作成してみました。
キャラクターの職業毎にクラスを分けており、クラス毎に微妙にオブジェクト生成時の処理が異なっていますが、各々のクラスのオブジェクト生成処理を共通化することができています。
【サンプルコード】
・AbstractJob.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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
1 2 3 4 5 6 7 8 9 10 |
public abstract class AbstractJobFactory { public final AbstractJob create(String playerName) { AbstractJob abstractJob = createJob(playerName); return abstractJob; } protected abstract AbstractJob createJob(String playerName); } |
・WarriorFactory.java
1 2 3 4 5 6 7 8 9 10 |
public class WarriorFactory extends AbstractJobFactory { protected AbstractJob createJob(String playerName) { Warrior warrior = new Warrior(); warrior.setPlayerName(playerName); warrior.setSkill("QuickSlash"); return warrior; } } |
・NormalPersonFactory.java
1 2 3 4 5 6 7 8 9 |
public class NormalPersonFactory extends AbstractJobFactory { protected AbstractJob createJob(String playerName) { NormalPerson normalPerson = new NormalPerson(); normalPerson.setPlayerName(playerName); return normalPerson; } } |
・CreateJobMain.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
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); } } } } |
【実行結果】
1 2 3 4 5 6 7 8 9 10 |
[プレイヤー:Player1] ・職業 Warrior ・スキル QuickSlash [プレイヤー:Player2] ・職業 NormalPerson ・スキル None |
いかがでしたでしょうか。
前に紹介したTemplate MethodパターンとFactory Methodパターンは似ているので、合わせて覚えておきたいパターンだと思います。
実務でも、「~Factory」という言葉を良く聞きます。「~Factoryはオブジェクトを生成するクラスだ」という知識があるだけでも、開発者同士のコミュニケーションがスムーズになると思います。
では、よいお年を!
コメント