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言語で学ぶデザインパターン入門も読んだけど、ちょっと難しかった。
  • でも、結城さんも初めて学んだときは苦戦したみたいだと知り、少しホッとした。