Singletonパターン

Head First デザインパターンのメモ。

Singletonパターン

一つのクラスがただ一つのインスタンスを持つことを保証し、
インスタンスにアクセスするグローバルポイントを提供する。

注意点

  • マルチスレッドアプリケーションに対してはパフォーマンスとリソース制限によって適切なSingletonの実装方法を選ばなければならない。
  • 複数のクラスローダを使用する場合は、複数のインスタンスが作成される場合があるので注意。
  • Singletonクラスをサブクラス化することは難しい。サブクラス化が必要な場合にはまず設計を見直す。
  • Singletonを正しく実装することは意外と厄介。

実装

// マルチスレッドアプリ用に二重チェックロッキングを使うSingleton
public class Singleton {
    private volatile static Singleton uniqueInstance;
    private Singleton() {}
    public static Singleton getInstance() {
        // インスタンスがない場合同期ブロックへ
        if (uniqueInstance == null) {
            // 同期化はオーバーヘッドとなるため初回実行時のみ同期化
            synchronized (Singleton.class) {
                // 再度チェック
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
    }
}


Abstract Factoryパターン