2015年6月7日日曜日

1-5. Singleton パターン

クラスが1つのインスタンスしか持たないことを保証し、それにアクセスするインターフェース
を提供します。



プログラム中でただ1つのインスタンスを複数個所で利用したい場合に使用します。

static フィールドによる実装:
クラスがロードされるときにインスタンスが生成されます。
Initialization-on-demand holder idiom による実装:
getInstance() の最初の呼び出しでインスタンスの取得時にインスタンスが生成されます。

実行結果:
    // static フィールドによる実装。
    new Date():     2015/06/07 03:35:51.700
    DateSingleton1()
    DateSingleton1: 2015/06/07 03:35:51.702
    DateSingleton1: 2015/06/07 03:35:51.702
    // Initialization-on-demand holder idiom による実装。
    new Date():     2015/06/07 03:35:51.702
    DateSingleton2()
    DateSingleton2: 2015/06/07 03:35:51.703
    DateSingleton2: 2015/06/07 03:35:51.703
package design_pattern;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Singleton
 * GoF, Code Complete
 * クラスが1つのインスタンスしか持たないことを保証し、それにアクセスするインターフェース
 * を提供します。
 * 
 * プログラム中でただ1つのインスタンスを複数個所で利用したい場合に使用します。
 * 
 * static フィールドによる実装:
 * クラスがロードされるときにインスタンスが生成されます。
 * Initialization-on-demand holder idiom による実装:
 * getInstance() の最初の呼び出しでインスタンスの取得時にインスタンスが生成されます。
 * 
 * 実行結果:
 * <pre>
 *     // static フィールドによる実装。
 *     new Date():     2015/06/07 03:35:51.700
 *     DateSingleton1()
 *     DateSingleton1: 2015/06/07 03:35:51.702
 *     DateSingleton1: 2015/06/07 03:35:51.702
 *     // Initialization-on-demand holder idiom による実装。
 *     new Date():     2015/06/07 03:35:51.702
 *     DateSingleton2()
 *     DateSingleton2: 2015/06/07 03:35:51.703
 *     DateSingleton2: 2015/06/07 03:35:51.703
 * </pre>
 * 
 * @author 2015/05/24 matsushima
 */
public class SingletonSample {
	/**
	 * main
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
		System.out.println("// static フィールドによる実装。");
		Date date11 = new Date();
		System.out.println("new Date():     " + df.format(date11));
		Date date12 = DateSingleton1.getInstance().getDate();
		System.out.println("DateSingleton1: " + df.format(date12));
		Date date13 = DateSingleton1.getInstance().getDate();
		System.out.println("DateSingleton1: " + df.format(date13));
		System.out.println("// Initialization-on-demand holder idiom による実装。");
		Date date21 = new Date();
		System.out.println("new Date():     " + df.format(date21));
		Date date22 = DateSingleton2.getInstance().getDate();
		System.out.println("DateSingleton2: " + df.format(date22));
		Date date23 = DateSingleton2.getInstance().getDate();
		System.out.println("DateSingleton2: " + df.format(date23));
	}
}

/** static フィールドによる実装。 */
final class DateSingleton1 {
	private static final DateSingleton1 instance = new DateSingleton1();
	private Date date = new Date();
	private DateSingleton1() {
		System.out.println("DateSingleton1()");
	}
	public static DateSingleton1 getInstance() {
		return DateSingleton1.instance;
	}
	public Date getDate() {
		return this.date;
	}
}

/** Initialization-on-demand holder idiom による実装。 */
final class DateSingleton2 {
	private Date date = new Date();
	private DateSingleton2() {
		System.out.println("DateSingleton2()");
	}
	private static class DateSingletonHolder {
		private static final DateSingleton2 instance = new DateSingleton2();
	}
	public static DateSingleton2 getInstance() {
		return DateSingletonHolder.instance;
	}
	public Date getDate() {
		return this.date;
	}
}

0 件のコメント:

コメントを投稿