GoFのデザインパターンのシングルトン(Singleton)をRubyのサンプルコードで紹介します。
シングルトンパターンは、1つだけに限定されたインスタンスを複数のオブジェクト内で共有する場合に用います。たとえば、ログの書込処理を行うメソッドでのファイルへのアクセスや、システム内で共通のキャッシュテーブルを参照する場合などです。
🎳 GoFのシングルトンの前提条件
- 作成したクラスは唯一1つだけのインスタンスを自身で作成する
- システム内のどこでもその1つだけのインスタンスにアクセスできる
😼 サンプルソース
シングルトンパターンのサンプルを作成していきます。
ここでは、Rubyの標準ライブラリのSingleton
モジュールを使います。
このSingletonモジュールを使うことで、Mix-inしたクラスのインスタンスは常に同一のものを返すようになります。
# Singletonは、Mix-inしたクラスのinstanceは同一のインスタンスを返すようになる |
上のコードを動かしてみます。
obj1 = SingletonObject.instance |
Singletonの条件を満たすオブジェクトを生成できていることがわかります。
また、Object#new
が失敗することも次のコードで確認できます。
obj3 = SingletonObject.new |
😎 どんなときに使うの?
- アプリケーションで一度だけ読めばいい設定ファイルの内容のコンテナなど
- コネクションプーリングのように作成したインスタンスをプールして使いまわすとき
👽 Singletonの課題
Singletonには次のような課題があるため、安易に使わず、必要な箇所に使うようにすべきです。
- グローバル変数の代わりになると、複数箇所で変更されるとカオスになる
- コードが密結合になりやすく、テストを書きづらくなる