Singletonパターン

プログラミング、サーバー、ネットワーク、IT用語、ハマったときのトラブルシューティングなど様々なIT関連の話題をひたすら書いていく技術ブログです。

2017年1月8日日曜日

Singletonパターン

インスタンスが1個しか存在しないことを保証する

プログラムを書いていると通常たくさんのインスタンスが生成されます。しかし、プログラムを書くにつれて問題も発生してきます。

・複数のクラスが同じインスタンスを必要としている
・アプリケーション全体で1つのオブジェクトであるべき、または保証したい

インスタンス生成はメモリーの消費量も大きい場合が多いので、むやみにインスタンスを生成するとシステムの挙動が遅くなったり、最悪メモリーが足りなくなったりします。

この問題を解決するためには、開発者が気を付けていれば良いのですが、どんなに優秀な人でも必ずミスをしますので、開発者はクラスを作成するときに、そのクラスのオブジェクトが1つであるように保証するクラスを作成すれば良いのです。それがSIngletonパターンです。

Singletonパターンの特徴

・クラスのインスタンスが1つであることを保証する
・インスタンスが一つだけ必要な時に使用する
・その一つのインスタンスにアクセスする方法を持つ

Singletonパターンの構造



Singletonパターンのメリット、デメリット

- メリット
・1つのインスタンスのアクセスをコントロールできる
・名前空間を減らせる→グローバル変数を避けることができる
・必要な分だけのインスタンス数を制御できる

- デメリット
・Singletonの状態は、マルチスレッドの環境下でスレッド間でシェアされる

Singletonのプログラム

Singleton.javaの4行目のstaticフィールド(クラス変数)をSingletonクラスのインスタンスで初期化しています。この初期化はSIngletonクラスがロードされた時に一度だけ行なわれます

Singleton.javaの6行目のコンストラクタがprivateになっている理由はSingletonクラス以外からコンストラクタの呼び出しを禁止しているためです。Singletonクラス以外から「new Singleton()」のようにインスタンス化しようとしてもエラーになります。

Singleton.javaの10行目のgetInstanceはSingletonクラスのインスタンスを取得するためのメソッドです。このメソッドからのみインスタンスを取得できるようにしてコントロールします。

Main.javaではs1とs2にインスタンスを代入していますが、実行結果のresult.txtの1行目に「Singleton is created.」と1回しか表示されていないので、インスタンス作成が1回のみしか行われていないことになります。





Singletonはなぜ必要なのか?

Singletonはインスタンスを1つに制限するデザインパターンです。なぜ制限をするのでしょうか?いくつか理由は考えられますが、1つの理由としてプログラムを書く上では前提条件をしっかり決めてからプログラムを書くことや曖昧な状況を排除してからプログラムを書くことが大切になってきます。Singletonを利用すれば、「インスタンスは1つしかない」という条件のもとプログラムを書くことができます。

◯「デザインパターン」シリーズの一覧はこちら



最近の投稿