ForNext
Only Do What Only You Can Do
Factory Method
VBScript
JScript
Perl
PHP
Python
Ruby
PowerShell
Scala
F#
C
C++
C++Builder
VC++
C#
Java
更新日 : 2010.11.24
■ Step 1
■ MyClassA1
public class MyClassA1 { public String getName() { return "Suzuki"; } public int getAge() { return 20; } }
■ MyClassB1
public class MyClassB1 { public String getAddress() { return "Tokyo"; } public int getFloor() { return 2; } }
■ MyMain
public class MyMain { public static void main(String args[]) { MyClassA1 classA = new MyClassA1(); System.out.println(classA.getName()); System.out.println(classA.getAge()); MyClassB1 classB = new MyClassB1(); System.out.println(classB.getAddress()); System.out.println(classB.getFloor()); } }
L:\>java MyMain Suzuki 20 Tokyo 2
■ Step 2
■ MyClassA (追加)
public abstract class MyClassA { public abstract String getName(); public abstract int getAge(); }
■ MyClassA1 (MyClassA から 継承するよう 変更)
public class MyClassA1 extends MyClassA { public String getName() { return "Suzuki"; } public int getAge() { return 20; } }
■ MyClassA2 (追加)
public class MyClassA2 extends MyClassA { public String getName() { return "Tanaka"; } public int getAge() { return 30; } }
■ MyClassB (追加)
public abstract class MyClassB { public abstract String getAddress(); public abstract int getFloor(); }
■ MyClassB1 (MyClassB から 継承するよう 変更)
public class MyClassB1 extends MyClassB { public String getAddress() { return "Tokyo"; } public int getFloor() { return 2; } }
■ MyClassB2 (追加)
public class MyClassB2 extends MyClassB { public String getAddress() { return "Yokohama"; } public int getFloor() { return 3; } }
■ MyMain
public class MyMain { public static void main(String args[]) { MyClassA classA = new MyClassA1(); System.out.println(classA.getName()); System.out.println(classA.getAge()); MyClassB classB = new MyClassB1(); System.out.println(classB.getAddress()); System.out.println(classB.getFloor()); classA = new MyClassA2(); System.out.println(classA.getName()); System.out.println(classA.getAge()); classB = new MyClassB2(); System.out.println(classB.getAddress()); System.out.println(classB.getFloor()); } }
L:\>java MyMain Suzuki 20 Tokyo 2 Tanaka 30 Yokohama 3
■ Step 3 Factory Method
■ MyClassA (変更)
public abstract class MyClassA { public abstract String getName(); public abstract int getAge(); // ファクトリメソッド を 追加 public abstract MyClassB createMyClassB(); }
■ MyClassA1 (変更)
public class MyClassA1 extends MyClassA { public String getName() { return "Suzuki"; } public int getAge() { return 20; } // ファクトリメソッド を 追加 public MyClassB createMyClassB() { return new MyClassB1(); } }
■ MyClassA2 (変更)
public class MyClassA2 extends MyClassA { public String getName() { return "Tanaka"; } public int getAge() { return 30; } // ファクトリメソッド を 追加 public MyClassB createMyClassB() { return new MyClassB2(); } }
■ MyMain
public class MyMain { public static void main(String args[]) { MyClassA classA = new MyClassA1(); System.out.println(classA.getName()); System.out.println(classA.getAge()); // ファクトリメソッド を 使用 MyClassB classB = classA.createMyClassB(); // classB1 を使っているのか、classB2 を使っているのか、意識しない System.out.println(classB.getAddress()); System.out.println(classB.getFloor()); classA = new MyClassA2(); System.out.println(classA.getName()); System.out.println(classA.getAge()); // ファクトリメソッド を 使用 classB = classA.createMyClassB(); // classB1 を使っているのか、classB2 を使っているのか、意識しない System.out.println(classB.getAddress()); System.out.println(classB.getFloor()); } }
L:\>java MyMain Suzuki 20 Tokyo 2 Tanaka 30 Yokohama 3