インスタンス生成の分岐: factory method パターン
stuff → staff
元: インスタンス生成の分岐(Java) - Red > Green > Refactor > Red
自分に一番響く設計を手当たり次第
デザインパターンの Factory method より (記事中では Factory > Creator)
src | +-- jp.ymatsukawa +-- Main.java | +-- stuff | + -- Creator.java + -- StuffCreator.java + -- Stuff.java + -- Manager.java + -- Engineer.java
jp.ymatsukawa/Main.java
package jp.ymatsukawa; import jp.ymatsukawa.stuff.Creator; import jp.ymatsukawa.stuff.Stuff; import jp.ymatsukawa.stuff.StuffCreator; public class Main { public static void main(String[] args) { Creator stuffCreator = new StuffCreator(); Stuff manager = stuffCreator.create("manager"); Stuff engineer = stuffCreator.create("engineer"); System.out.println(manager.getMonthlySalary()); // 40 System.out.println(engineer.getMonthlySalary()); // 30 } }
jp.ymatsukawa/stuff/Creator.java
package jp.ymatsukawa.stuff; public abstract class Creator { public Stuff create(String stuffCode) { Stuff stuff = this.createStuff(stuffCode); return stuff; } protected abstract Stuff createStuff(String stuffCode); }
jp.ymatsukawa/stuff/StuffCreator.java
package jp.ymatsukawa.stuff; public class StuffCreator extends Creator { public Stuff createStuff(String stuffName) { switch(stuffName) { case "manager": return new Manager(); case "engineer": return new Engineer(); default: throw new RuntimeException(); } } }
jp.ymatsukawa/stuff/Stuff.java
package jp.ymatsukawa.stuff; public abstract class Stuff { private final int baseSalary = 20; public abstract int getMonthlySalary(); protected int getBaseSalary() { return this.baseSalary; } }
jp.ymatsukawa/stuff/Manager.java
package jp.ymatsukawa.stuff; public class Manager extends Stuff { public int getMonthlySalary() { return this.getBaseSalary() + 20; } }
jp.ymatsukawa/stuff/Engineer.java
package jp.ymatsukawa.stuff; public class Engineer extends Stuff { public int getMonthlySalary() { return this.getBaseSalary() + 10; } }