【デザインパターン】【GoF】【Java】 Abstract Factory パターン

使いどころ

 * グループをなす一連のクラスを使用したい場合
   => 例えば、特定のDBMS(OracleSQL ServerMySQL etc)にアクセスする機能
   => 例えば、ファイル(CSVJSONXML etc)生成する機能

サンプル

 * サンプルを作成した感想としては、以下のサイトで言っている
 「状況に応じて、プログラムの一部を丸ごと交換したいとき」ってのが本当に当てはまるなーって思った。
http://itpro.nikkeibp.co.jp/article/COLUMN/20051202/225609/

Factory.java

★ここがキモ★
public abstract class Factory {
   public static Factory createFactory(String className) {
      switch (className) {
      case "Win":
         return new EnvironmentWinFactory();
      default:
         return new EnvironmentLinuxFactory();
      }
   }

   public abstract RDBMS createRDBMS();

   public abstract Os createOs();
}

EnvironmentLinuxFactory.java

Factoryを継承
public class EnvironmentLinuxFactory extends Factory {
   public RDBMS createRDBMS() {
      return new Oracle();
   }

   public Os createOs() {
      return new Linux();
   }
}

EnvironmentWinFactory.java

Factoryを継承
public class EnvironmentWinFactory extends Factory {
   public RDBMS createRDBMS() {
      return new SqlServer();
   }
   public Os createOs() {
      return new Windows();
   }
}

Os.java

public abstract class Os {
   public abstract String getName();
   public abstract String getVendor();
   public abstract String getVersion();
}

Windows.java

Osを継承
public class Windows extends Os {
   public String getName() {
      return "Windows";
   }
   public String getVendor() {
      return "Microsoft";
   }
   public String getVersion() {
      return "Windows XP";
   }
}

Linux.java

Osを継承
public class Linux extends Os {
   public String getName() {
      return "Red Hat";
   }
   public String getVendor() {
      return "Red Hat";
   }
   public String getVersion() {
      return "Red Hat Enterprise Linux Server release 5.7";
   }
}

RDBMS.java

public abstract class RDBMS {
   public abstract String getName();
   public abstract String getVendor();
   public abstract String getVersion();
}

SqlServer.java

RDBMSを継承
public class SqlServer extends RDBMS {
   public String getName() {
      return "SQL Server";
   }

   public String getVendor() {
      return "Microsoft";
   }

   public String getVersion() {
      return "SQL Server 2008 R2";
   }
}

Oracle.java

RDBMSを継承
public class Oracle extends RDBMS {
   public String getName() {
      return "Oracle";
   }

   public String getVendor() {
      return "Oracle";
   }

   public String getVersion() {
      return "11g";
   }
}

Main.java

実行するクラス
public class Main {
   public static void main(String[] args) {
      
      Factory factory = Factory.createFactory("Win");
      Os os = factory.createOs();
      RDBMS rdbms = factory.createRDBMS();
      
      System.out.println(
            "OS Name " + os.getName() +
            " Vendor " + os.getVendor() +
            " Version : " + os.getVersion());
      System.out.println(
            "RDBMS Name " + rdbms.getName() +
            " Vendor " + rdbms.getVendor() +
            " Version : " + rdbms.getVersion());
      
      System.out.println("----------");
      
      factory = Factory.createFactory("Linux");
      os = factory.createOs();
      rdbms = factory.createRDBMS();
      
      System.out.println(
            "OS Name " + os.getName() +
            " Vendor " + os.getVendor() +
            " Version : " + os.getVersion());
      System.out.println(
            "RDBMS Name " + rdbms.getName() +
            " Vendor " + rdbms.getVendor() +
            " Version : " + rdbms.getVersion());
   }
}

出力

OS Name Windows Vendor Microsoft Version : Windows XP
RDBMS Name SQL Server Vendor Microsoft Version : SQL Server 2008 R2
----------
OS Name Red Hat Vendor Red Hat Version : Red Hat Enterprise Linux Server release 5.7
RDBMS Name Oracle Vendor Oracle Version : 11g

関連するデザインパターン

 [1] Factory Methodパターン