Javaにおけるシングルトンパターン:Javaアプリケーションにおけるグローバルアクセスポイントの実装
約2分
別名
- 単一インスタンス
シングルトンデザインパターンの目的
Javaクラスに1つのインスタンスのみを持たせ、このシングルトンインスタンスへのグローバルアクセスポイントを提供します。
シングルトンパターンの詳細な説明と現実世界の例
現実世界の例
シングルトンパターンの現実世界のアナロジーとして、政府によるパスポート発行があります。ある国では、各市民は一度に1つの有効なパスポートしか発行されません。パスポート事務所は、同一人物に重複したパスポートが発行されないようにします。市民が旅行する必要がある場合、この単一のパスポートを使用する必要があり、これは旅行資格の唯一のグローバルに認識される識別子として機能します。この制御されたアクセスと一意のインスタンス管理は、シングルトンパターンがJavaアプリケーションで効率的なオブジェクト管理をどのように保証するかを反映しています。
簡単に言うと
特定のクラスのオブジェクトが1つしか作成されないことを保証します。
Wikipediaによると
ソフトウェア工学において、シングルトンパターンとは、クラスのインスタンス化を1つのオブジェクトに制限するソフトウェアデザインパターンです。これは、システム全体でアクションを調整するために正確に1つのオブジェクトが必要な場合に役立ちます。
Javaにおけるシングルトンパターンのプログラミング例
Joshua Bloch、「Effective Java 第2版」p.18
シングルトンを実装する最良の方法は、単一要素の列挙型です。
public enum EnumIvoryTower {
INSTANCE
}
使用するには
var enumIvoryTower1 = EnumIvoryTower.INSTANCE;
var enumIvoryTower2 = EnumIvoryTower.INSTANCE;
LOGGER.info("enumIvoryTower1={}", enumIvoryTower1);
LOGGER.info("enumIvoryTower2={}", enumIvoryTower2);
コンソール出力
enumIvoryTower1=com.iluwatar.singleton.EnumIvoryTower@1221555852
enumIvoryTower2=com.iluwatar.singleton.EnumIvoryTower@1221555852
Javaでシングルトンパターンを使用する場合
シングルトンパターンを使用する場合
- クラスのインスタンスが正確に1つだけ存在する必要があり、よく知られたアクセスポイントからクライアントがアクセスできる必要があります。
- 唯一のインスタンスをサブクラス化によって拡張する必要があり、クライアントがコードを変更せずに拡張されたインスタンスを使用できるようにする必要がある場合。
Javaにおけるシングルトンパターンの現実世界のアプリケーション
- ロギングクラス
- 多くのアプリケーションにおける設定クラス
- 接続プール
- ファイルマネージャー
- java.lang.Runtime#getRuntime()
- java.awt.Desktop#getDesktop()
- java.lang.System#getSecurityManager()
シングルトンパターンの利点とトレードオフ
利点
- 単一インスタンスへのアクセス制御。
- 名前空間の汚染の軽減。
- 操作と表現の改良を可能にします。
- 可変数のインスタンス(必要に応じて複数)を許可します。
- クラス操作よりも柔軟性があります。
トレードオフ
- グローバル状態のため、テストが困難です。
- ライフサイクル管理が複雑になる可能性があります。
- 注意深く同期処理を行わないと、同時実行コンテキストで使用した場合にボトルネックが発生する可能性があります。
関連するJavaデザインパターン
- 抽象ファクトリ:クラスに1つのインスタンスのみを持たせるために使用されることがよくあります。
- ファクトリメソッド:シングルトンパターンは、作成ロジックをカプセル化するファクトリメソッドを使用して実装できます。
- プロトタイプ:インスタンスを作成する必要がないため、シングルトンと連携して一意のインスタンスを管理できます。