はじめに
GoFのデザインパターンを紹介している『増補改訂版 Java言語で学ぶデザインパターン入門』を読んで、学んだ内容についてまとめます。
Singletonパターン
Singletonとは
日本語に訳すとトランプの1枚札のことで、全体の集合の中で1つしか存在しないものを意味します。
このことからシステム全体でインスタンスが1つしか存在しないことを保証するパターンのことをSingletonパターンと言います。
登場人物
Singletonパターンで使用するのは以下のクラス図に登場するクラスです。
と言ってもSingletonクラスの1つしかありません。
具体例
具体例として、singletonクラスと実行クラスをもとに説明します。
実装クラス
- Singletonクラス
package singleton;
public class Singleton {
// 1.staticフィールド(クラス変数)としてsingletonを定義
private static Singleton singleton = new Singleton();
// 2.privateなコンストラクタ
private Singleton() {
System.out.println("インスタンスの生成に成功しました");
}
// 3.singletonインスタンスの返却
public static Singleton getInstance() {
return singleton;
}
}
ポイントは以下の3点です。
**1.**privateなクラス変数としてsingleton
が定義されている。
**2.**コンストラクタがprivateになっており、他のクラスから呼び出すことができない。(newできない)
**3.**singletonインスタンスを返却するgetInstance()
メソッドを定義している。
補足の説明を行います。
まず、外部のクラスからpublicなgetInstance()
メソッドが呼ばれます。
その際に初めて呼ばれる場合は、Singletonクラスの初期化が行われ、その時に一度だけSingletonクラスのインスタンスが生成されます。
以降、getInstance()
メソッドが呼ばれる場合は既に生成したSingletonクラスのインスタンスが返されます。
コンストラクタ内ではインスタンスの生成が成功したことが分かるように出力を行っていますが、通常は不要です。
実行クラス
-
Mainクラス
getInstance()
メソッドを2回呼び出し、同じインスタンスを取得していることを確認します。
package singleton;
public class Main {
public static void main(String[] args) {
System.out.println("***実行クラス開始***");
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
if (obj1 == obj2) {
System.out.println("obj1 is obj2");
} else {
System.out.println("obj1 is not obj2");
}
System.out.println("***実行クラス終了***");
}
}
実行結果
Main.java
を実行した結果は以下になります。
obj1 is obj2
が出力されており、同一のインスタンスを取得できていることが確認できます。
***実行クラス開始***
インスタンスの生成に成功しました
obj1 is obj2
***実行クラス終了***
メリット
Singletonパターンを利用することで、システム全体でインスタンスが1つしか存在しないことが保証できます。
このようにすることで、複数のインスタンスが絡み合い、思いがけないバグが発生してしまうことを未然に防ぐことができます。
まとめ
インスタンスが1つしか存在しないことを保証するSingletonパターンに関して学びました。
以下でサンプルコードをアップしていますのでよろしければ参考にどうぞ。
また、他のデザインパターンに関しては以下でまとめていますので、こちらも参考にどうぞ。