記憶庫

自分用のメモです。

Singleton パターン

GoFデザインパターン23種類の中で最も理解しやすい Singleton パターンについて。

Singleton パターンとは?

Singleton パターンとは、生成されるインスタンスが1個だけであることを保証する設計手法である。
「規約として、インスタンスを1個しか生成しない」のではなく、どう頑張っても1個しか生成できないように実装するのである。

Singleton パターンの特徴

  1. コンストラクタを private で宣言し、外部からのインスタンス生成を許可しない。
  2. 唯一のインスタンスを保持するための static メンバ変数を持つ。
  3. 唯一のインスタンスを取得するための static な getInstance() メソッドを持つ。

簡単な実装例

以下に実装例を書く。

package knowledgefort.labo.oo.singleton;

/**
 * @author おやつ丸
 */
public final class SingletonLabo {
	
	static {
		
		labo = new SingletonLabo();
	}
	
	
	/**
	 * 外部からのインスタンス生成は出来ません。
	 */
	private SingletonLabo() {}
	
	
	/**
	 * SingletonLabo クラスの唯一のインスタンスを取得します。
	 * 
	 * @return
	 */
	public static SingletonLabo getInstance() {
		
		return labo;
	}
	
	/**
	 * @return
	 */
	public void display() {
		System.out.println(this.getClass().getName());
		return;
	}
	
	//*** 変数
	private static final SingletonLabo labo;
}

上記の例では、クラスが最初に参照され時に static イニシャライザにて唯一のインスタンスを生成している。
getInstance() が呼び出された時に変数 labo の null チェックを行って null だったら生成する方法もあるが、同期化コストが掛かるので非推奨。

使用方法

以下の通り。

import knowledgefort.labo.oo.singleton.*;

・・・

public static void main(String[] args) {
	SingletonLabo.getInstance().display();
	return;
}

出力は以下の通り。

knowledgefort.labo.oo.singleton.SingletonLabo