« 回線速度の計測 ( その2 ) | トップページ | HTML + CSS で数式組版 »

2009年3月13日 (金)

Factory の私達

実装クラスを、適当なタイミングで差し替えたいわけですね。

>java Main Foo1Factory
class Foo1Factory
Foo1@9304b1

>java Main Foo2Factory
class Foo2Factory
Foo2@9304b1
public class Main {
  public static void main(String[] args) throws ClassNotFoundException {
    Class.forName(args[0]);
    Foo foo = FooFactory.createFoo();
    System.out.println(foo);
  }
}
public abstract class FooFactory {
  static FooFactory factory;
  public static Foo createFoo() {
    return factory.createFooImpl();
  }
  public abstract Foo createFooImpl();
}
public class Foo1Factory extends FooFactory {
  @Override
  public Foo createFooImpl() {
    return new Foo1();
  }
  static {
    FooFactory.factory = new Foo1Factory();
    System.out.println(Foo1Factory.class);
  }
}
public class Foo2Factory extends FooFactory {
  @Override
  public Foo createFooImpl() {
    return new Foo2();
  }
  static {
    FooFactory.factory = new Foo2Factory();
    System.out.println(Foo2Factory.class);
  }
}

しかし、クラスの数が増えてくると、似たような Factory のコードをいっぱい書かなければならないのが、面倒になってくるわけでして。”汎用ファクトリ”が欲しくなってきます。そこで、 Dependency Injection Container ( DI コンテナ) の登場、ということになります。

でも、外部ライブラリ ( DI コンテナ) を使いたくないってこともあります。ソース・コードだけで完結する、ということにも色々メリットがありますしね。そういったときは、 Factory パターンを使えばよいかと。

余談。

実装クラスを差し替えたい場合というのは、たいていは、リンク・エディット時に実装クラスを決めたいってことだったりします。ひとつのソース・ツリーから、2種類以上の実行ファイルを作り出したいとき。どのソース・ファイルがビルドに含まれるかによって、 どの実装クラスを使うのかが決まるようにしたいわけです。

でも、 Java には、スタティック・リンクという概念がないのですよね。結局、差し替えるのは、アプリケーション起動時になります。

アプリケーション起動時に実装が決まる、というのは、なにか中途半端に感じるのですよね。実装を決めたいのは、普通はビルド時じゃないかな。ソフトウエアを配布する前。

ソフトウエアの実行中(起動時にあらず)に実装を差し替える、という要件は、電話の交換機のソフトウエアなどではあるらしいですね。台数が多いから、いちいちデプロイ・再起動なんてやってられない、ってことですかね。全部自動で入れ替われ、と。

|

« 回線速度の計測 ( その2 ) | トップページ | HTML + CSS で数式組版 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/80472/28592129

この記事へのトラックバック一覧です: Factory の私達:

« 回線速度の計測 ( その2 ) | トップページ | HTML + CSS で数式組版 »