使いどころ
* グループをなす一連のクラスを使用したい場合 => 例えば、特定のDBMS(Oracle、SQL Server、MySQL etc)にアクセスする機能 => 例えば、ファイル(CSV、JSON、XML 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パターン
参考文献
http://japan.internet.com/developer/20090512/26.htmlhttp://d.hatena.ne.jp/lagos_on/20081224/1230079993
http://www.techscore.com/tech/DesignPattern/AbstractFactory.html/
http://www.itsenka.com/contents/development/designpattern/abstract_factory.html