Singleton(シングルトン)とは
「Singleton(シングルトン)」はデザインパターンの一種です。「Singleton(シングルトン)パターン」と呼ばれることもあります。
「あるクラスのインスタンスが常にたった1つしか存在していない」という状態を実現したいときに利用されます。
※どのクラスが最初1回だけメモリを与えて(Static)そのメモリにオブジェクトを作成しておいて利用するデザインパターンです。
使用例
Simpleな方法
public class Singleton {
private Singleton() {
System.out.println("Hello singleton!!");
}
private static Singleton singleton = new Singleton();
public static Singleton getInstance() {
return singleton;
}
}
- private static Singleton singleton = new Singleton():最初、1回だけオブジェクトを初期化するため、Thread-Safeを保証します。
- getInstance():オブジェクトを利用するためには、このメソッドを通さなければなりません。
LazyHolder
public class Singleton {
private Singleton() {
System.out.println("Hello singleton!!");
}
private static class LazyHolder {
public static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
- Javaだけで利用する場合に一番使われている方法です。
- getInstance():LazyHolderクラスをロードしてSingletonオブジェクトを初期化します。
- また、クラスをロードする時点ではThread-Safeを保証するため、インスタンスが複数になる可能性はないです。
オブジェクト呼び出し
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
}
- シングルトンでクラスを作成したらそのクラスはnewでオブジェクトを作るのは不可になります。
- Singleton.getInstance():このメソッドを通して、インスタンスを取得します。
デメリット
- オブジェクトの役割が簡単ではなく複雑な場合は該当シングルトン・オブジェクトを利用する他のオブジェクト間の結合度が高くなるため、オブジェクト指向設計原則に反します。
- メンテナンスが難しくなり、テストも難しくなります。
- マルチスレッド環境で同期化処理をしていない場合、インスタンスが複数生成されたりする場合があります。
終わりに
今回はデザインパターン(Design Pattern)のシングルトン(Singleton)について調べてみました。
使い方についてはもっとあるかと思いますが、それは次回時間があるときにまとめてみたいと思います。
