Abstract Factoryアブストラクトファクトリー-デザインパターン勉強メモ
Abstract Factoryアブストラクトファクトリー。
abstract「抽象的な」、factory「工場」
クライアントのプログラムを変更することなく、実行環境や実行時の引数の違いによって、処理フローを変更するときに使います。
Javaデザインパターン徹底攻略 (標準プログラマーズライブラリ)に載ってたサンプルコードを少し変更して載せておきます。
MyClassA.java 1 abstract class MyClassA { 2 abstract String getName(); 3 abstract int getAge(); 4 }
MyClassA1.java 1 class MyClassA1 extends MyClassA { 2 String getName() { return "Suzuki"; } 3 int getAge() { return 20; } 4 }
MyClassA2.java 1 class MyClassA2 extends MyClassA { 2 String getName() { return "Tanaka"; } 3 int getAge() { return 30; } 4 }
MyClassB.java 1 abstract class MyClassB { 2 abstract String getVendor(); 3 abstract String getDate(); 4 }
MyClassB1.java 1 class MyClassB1 extends MyClassB { 2 String getVendor() { return "Foo Computer"; } 3 String getDate() { return "2002/04/01"; } 4 }
MyClassB2.java 1 class MyClassB2 extends MyClassB { 2 String getVendor() { return "Bar Computer"; } 3 String getDate() { return "1990/12/25"; } 4 }
MyFactory.java 1 abstract class MyFactory { 2 abstract MyClassA createMyClassA(); 3 abstract MyClassB createMyClassB(); 4 5 static MyFactory getFactory(String owner) { 6 if(owner.equals("Suzuki")) { 7 return(new MyFactory1()); 8 } else if (owner.equals("Tanaka")) { 9 return(new MyFactory2()); 10 } else { 11 return null; 12 } 13 } 14 15 }
MyFactory1.java 1 class MyFactory1 extends MyFactory { 2 MyClassA createMyClassA() { return(new MyClassA1()); } 3 MyClassB createMyClassB() { return(new MyClassB1()); } 4 }
MyFactory2.java 1 class MyFactory2 extends MyFactory { 2 MyClassA createMyClassA() { return(new MyClassA2()); } 3 MyClassB createMyClassB() { return(new MyClassB2()); } 4 }
MyMain.java 1 class MyMain { 2 public static void main(String[] args) { 3 4 if (args.length != 1) { 5 System.out.println("引数を正しくしてして下さい."); 6 System.exit(0); 7 } 8 9 MyFactory factory = MyFactory.getFactory(args[0]); 10 11 if (factory != null) { 12 MyClassA classA = factory.createMyClassA(); 13 MyClassB classB = factory.createMyClassB(); 14 15 System.out.println(classA.getName()); 16 System.out.println(classA.getAge()); 17 System.out.println(classB.getVendor()); 18 System.out.println(classB.getDate()); 19 20 } else { 21 System.out.println("引数が間違っています."); 22 } 23 24 } 25 }
$ java MyMain 引数を正しくしてして下さい. $ java MyMain Tanaka Tanaka 30 Bar Computer 1990/12/25 $ java MyMain Suzuki Suzuki 20 Foo Computer 2002/04/01 $ java MyMain aiueo 引数が間違っています.
雑感
- 正直、良くわかってません。
- 上のサンプルコードではMyFactory.javaがポイントっぽい。引数によりサブクラスを決定している。
- 増補改訂版Java言語で学ぶデザインパターン入門も読んだけど、ちょっと難しかった。
- でも、結城さんも初めて学んだときは苦戦したみたいだと知り、少しホッとした。