﻿-----------------------------
Singletonパターンのの適用
-----------------------------
目的
　・インスタンスの数を１つだけの大域的なオブジェクトの実現
　・同一インスタンスを、全ての実体間で参照を引き回すことなく使用できるようにする

　・インスタンスの生成を遅らせることによるパフォーマンスの向上

-----------------------------
Javaでの実装
-----------------------------
1.GoFでの実装例
 →マルチスレッド非対応

2.スレッドセーフな推奨実装
　方法：staticフィールドに最初からインスタンスを生成して保時
　問題点：クラスロード時にインスタンスが生成されてしまう 。3番目の目的にあっていない。
　→そこで3の方法を利用する

3.スレッドセーフな方法(初回呼び出し時にインスタンス生成)
　内部クラス内で、staticフィールに保持
 (Double-Checked LockingはJavaではうまく動作しない)

-----------------------------
実装例
-----------------------------
1.状態を保持するSingletonオブジェクト
　→グローバルデータとよく似たものになり、システムの各パーツを結合して
　しまう可能性があるため、控えめに使用するべき

　※○×ゲームのGameクラスは、状態を持つSingletonオブジェクトのため、ダメな例。

2.ポリモーフィズムとSingleton
　親クラスのコンストラクタをprotectedにする
　getInstanceのオーバーライド

3.特定数のインスタンスが必要な場合
　public staticメソッドを修正