使いどころ
* グループをなす一連のクラスを使用したい場合 => 例えば、特定の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