Oracle Certified Java Programmer, Gold SE 7 の資格試験学習メモ
#Singletonデザインパターンとは
「そのクラスのインスタンスは常に1つしか存在しない」状態を作り出すパターン。
システム内で1つ作るだけで済むインスタンスや、1つだけしか作りたくないインスタンスがある場合に使用する。
#サンプル
public class SingletonSample {
private static SingletonSample singleton = new SingletonSample();
private SingletonSample(){
System.out.println("インスタンスを作成しました。");
}
public static SingletonSample getInstance(){
return singleton;
}
}
インスタンス用の変数はprivateでフィールドとして用意しておく。
privateコンストラクタを記述する。
インスタンス取得用のgetterメソッドを用意しておく。
シングルトンのデザインパターンはGang of Fourがまとめたものとのことで、もともとは下のような実装だったそう
public class OldSingletonSample {
private static OldSingletonSample singleton;
private OldSingletonSample(){
singleton = null;
}
public static OldSingletonSample getInstance(){
if(singleton == null){
singleton = new OldSingletonSample();
}
return singleton;
}
}
ただ、上の実装だと複数のスレッドが動いている場合に1つのスレッドがif文内を入っている時に別のスレッドが入れるようになってしまっている。
それを避けるために一番上のサンプルコードの実装になった模様。
#Singletonデザインパターンのポイント
- 「たった1つだけのインスタンスを作成する」というより、「そのインスタンスが1つしか存在しないことを保証する」ためにSingletonデザインパターンを使用する。
- インスタンスが1つしかなければ、他に影響するインスタンスがないため、「インスタンスは1つ」の条件下でプログラムが書ける。制御しやすい。
- 1つだけインスタンスを作成するだけといっても、クラスメソッドを使用しているので、多用は避けた方がいいらしい
#使いどころ
シングルトンの使いどころは、フラグ管理とかになるかも。ちょっと事例を調べてみよう。
#実装時に気をつけるポイント
- 必ずプライベートコンストラクタを記述しておく。これを書いておかないと、デフォルトコンストラクタが呼ばれるため、インスタンスが複数作成可能となってしまう。
- インスタンスを取得するgetterメソッドを必ず用意する。インスタンスの作成はそのシングルトンのクラス内でしか行わないため、メソッドを用意しないと使用できない。
#参考資料
学習に当たり以下の資料を参考としています。
・増補改訂版 Java言語で学ぶデザインパターン入門
・クラスのインスタンスを1つに保つ(Singletonパターン)