ForNext
Only Do What Only You Can Do
Abstract Factory
VBScript
JScript
Perl
PHP
Python
Ruby
PowerShell
Scala
F#
C
C++
C++Builder
VC++
C#
Java
更新日 : 2010.11.24
■ 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(); // } }
■ MyClassB (変更なし)
public abstract class MyClassB { public abstract String getAddress(); public abstract int getFloor(); }
■ MyClassB1 (変更なし)
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; } }
■ MyFactory (追加)
public abstract class MyFactory { protected MyClassA myClassA; protected MyClassB myClassB; public MyFactory() { myClassA = createMyClassA(); myClassB = createMyClassB(); } public MyClassA getMyClassA() { return myClassA; } public MyClassB getMyClassB() { return myClassB; } protected abstract MyClassA createMyClassA(); protected abstract MyClassB createMyClassB(); }
■ MyFactory1 (追加)
public class MyFactory1 extends MyFactory { protected MyClassA createMyClassA() { return new MyClassA1(); } protected MyClassB createMyClassB() { return new MyClassB1(); } }
■ MyFactory2 (追加)
public class MyFactory2 extends MyFactory { protected MyClassA createMyClassA() { return new MyClassA2(); } protected MyClassB createMyClassB() { return new MyClassB2(); } }
■ MySimpleFactory (追加)
public class MySimpleFactory { public static MyFactory getFactory(String owner) { if (owner.equals("Suzuki")) { return new MyFactory1(); } else if (owner.equals("Tanaka")) { return new MyFactory2(); } else { return null; } } }
■ MyMain (変更)
public class MyMain { public static void main(String args[]) { // シンプルファクトリを 使用して、ファクトリオブジェクトを 作成 MyFactory factory = MySimpleFactory.getFactory(args[0]); if (factory == null) return; // ファクトリメソッドを呼び出すのではなく、 // ファクトリオブジェクトが作成したオブジェクトを、使用する MyClassA classA = factory.getMyClassA(); MyClassB classB = factory.getMyClassB(); // classA1 を使っているのか、classA2 を使っているのか、意識しない System.out.println(classA.getName()); System.out.println(classA.getAge()); // classB1 を使っているのか、classB2 を使っているのか、意識しない System.out.println(classB.getAddress()); System.out.println(classB.getFloor()); } }
L:\>java MyMain Suzuki Suzuki 20 Tokyo 2 L:\>java MyMain Tanaka Tanaka 30 Yokohama 3