[Java] Singletonパターン | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

Javaでは無秩序にインスタンスを生成することはお作法としてよろしくないということになっています。

そこで、プログラマは無秩序にインスタンスを生成しないよう考慮しながらアプリケーションを構築していくわけですが、クラスを1つ1つ吟味していくと、クラスの性質上、インスタンスは1つしか作りたくない、あるいは1つだけ作っておけばいいというものが少なからず存在することに気づきます。

具体的な例としては、システムやアプリケーションの設定情報を保持するクラスや Abstract Factoryパターンや Builderパターンのように何らかのインスタンスを作成するためのクラスなどがそれにあたります。

このようにインスタンスが1つしか作成されないことを保証したい場合は、Singletonパターンを利用できます。


Singleton


Singleton.java

public class Singleton {

  // インスタンス
  private static Singleton singleton = new Singleton();
  
  // コンストラクタ
  private Singleton() {}
  
  /**
   * インスタンスを取得する。
   * @return Singleton
   */
  public static Singleton getInstance() {
    return singleton;
  }

}
このパターンのポイントは3つ。

自分自身のインスタンスをクラス変数(Staticフィールド)として持っている
このクラス変数の初期化(すなわちインスタンスの生成)はクラスのロード時に1回だけ行われます。
コンストラクタが private となっている
外部からコンストラクタが呼び出されること(すなわちインスタンスの生成)を防いでいます。
外部からインスタンスを取得するための手段として getInstance() というメソッドが用意されている
コンストラクタの代わりにこのメソッドを利用することにより誰がいつどこからインスタンスを取得しても、クラスのロード時に生成した唯一のインスタンスが返されることになります。

デザインパターンとしてはものすごくシンプルなものですが、にわか Java技術者としてはこれだけでも「なるほどなぁ。」と感動してしまいます。