矢沢久雄の早わかりGoFデザインパターン(3)第3回 Factory Methodパターン/Abstract Factoryパターン今回紹介する2つのパターンの名前には、どちらも「Factory(工場)」という言葉が入っています。何を作る工場なんでしょう?「オブジェクト」を生成する工場です。オブジェクトは、クラスのコピーをメモリにロードしたものであり「クラスのインスタンス」とも呼ばれます。Javaでは、MyClass m = new MyClass(); という構文でオブジェクトを生成します。newという命令を使っていることから、オブジェクトを生成することを「newする(ニューする)」とも言います。 複数のプログラマが1つのシステムを構築する場合には「私はクラスを作る人、貴方はクラスを使う人」という役割分担ができます。クラスを使う人は、他の人が作ったクラスをnewするわけですが、ちょっと発想を変えてみましょう。クラスを作る人が、クラスをnewしたらどうでしょう。つまり、何らかのクラスをnewして返すメソッドを用意しておくのです。クラスを使う人にとって、便利になるはずです。これが、Factoryの基本的なアイディアです。ただし、GoFの2つのパターンでは、もう一ひねりも二ひねりも工夫が凝らされています。
【お役立ち度】★★★★☆
|
|
public abstract class OsDbFactory{ // 抽象メソッド public abstract OS createOS(); public abstract DBMS createDBMS(); // ファクトリクラスのオブジェクトを返すメソッド public static OsDbFactory getFactory(String db) { if (db.equals("WinSql") { return new WinSqlFactory(); } else if (db.equals("UnixOracle")) { return new UnixOracleFactory(); } else { return null; } } } |
処理内容が記述されていないメソッドを「抽象メソッド」と呼び、抽象メソッドを持つクラスを「抽象クラス」と呼びます。Javaでは、それらをabstractというキーワードで示します。抽象クラスOsDbFactory(これが抽象な工場)には、createOS( )とcreateDBMS( )という2つの抽象メソッドがあります。これらのメソッドの処理内容は、OsDbFactoryクラスを継承したWinSqlFactoryクラスおよびUnixOracleクラスで実装(処理内容を記述すること)されます。これらのクラスもファクトリクラスです。
WinSqlFactoryクラスのcreateOS( )メソッドはWindows用のクラスのオブジェクトを返し、createDBMS( )メソッドはSQL Server用のクラスのオブジェクトを返します。同様に、UnixOracleFactoryクラスのcreateOS( )メソッドはUnix用のクラスのオブジェクトを返し、createDBMS( )メソッドはOracle用のクラスのオブジェクトを返します。
OsDbFactoryクラスのgetFactory( )メソッドは、引数に指定された文字列に応じて、WinSqlFactoryクラスまたはUnixOracleFactoryクラスのオブジェクトを返します。このメソッドによって、Windows+SQL Server環境とUnix+Oracle環境を切り替えることができるのです。
ファクトリクラスを使う人は、最初にgetFactory( )メソッドを呼び出して適切なファクトリクラスのオブジェクトを取得し、そのcreateOS( )とcreateDBMS( )を使って適切なクラスのオブジェクトを取得します(リスト2[拡大表示])。
リスト2●ファクトリクラスの使い方
|
// 変数envに環境を示す文字列が格納されているとする OsDbFactory f = OsDbFactory.getFactory(env); // 環境に応じたクラスのオブジェクトを取得する OS sys = f.createOS(); DBMS db = f.createDBMS(); |
2段階の手順になっていることを冗長だと感じたら、どうぞご自身のアイディアでファクトリクラスを作ってください。たとえば、createOS( )とcreateDBMS( )に環境を指定する引数を持たせ、それに応じて適切なクラスのメソッドを返すという案もいいでしょう。GoFデザインパターンに示された通りでなければいけない、という決まりはないのですから。
次回は、FacadeパターンとChain of Responsibilityパターンを紹介します。
矢沢久雄 グレープシティ株式会社(http://www.grapecity.com)アドバイザリースタッフ |
| 表紙ページへ |