シングルトンパターン(Singleton) | Ruby デザインパターン


GoFのデザインパターンのシングルトン(Singleton)をRubyのサンプルコードで紹介します。

シングルトンパターンは、1つだけに限定されたインスタンスを複数のオブジェクト内で共有する場合に用います。たとえば、ログの書込処理を行うメソッドでのファイルへのアクセスや、システム内で共通のキャッシュテーブルを参照する場合などです。

🚜 GoFのシングルトンの前提条件

  • 作成したクラスは唯一1つだけのインスタンスを自身で作成する
  • システム内のどこでもその1つだけのインスタンスにアクセスできる

🏀 サンプルソース

シングルトンパターンのサンプルを作成していきます。

ここでは、Rubyの標準ライブラリのSingletonモジュールを使います。
このSingletonモジュールを使うことで、Mix-inしたクラスのインスタンスは常に同一のものを返すようになります。

# Singletonは、Mix-inしたクラスのinstanceは同一のインスタンスを返すようになる
require 'singleton'

# シングルトン
class SingletonObject
# instanceメソッドが定義され、newメソッドがprivateに設定される
include Singleton
attr_accessor :counter

def initialize
@counter = 0
end
end

上のコードを動かしてみます。

obj1 = SingletonObject.instance
obj1.counter += 1
puts(obj1.counter)
# 1

obj2 = SingletonObject.instance
obj2.counter += 1
puts(obj2.counter)
# 2
# ↑ 前回の+1が引き継がれている #

Singletonの条件を満たすオブジェクトを生成できていることがわかります。
また、Object#newが失敗することも次のコードで確認できます。

obj3 = SingletonObject.new
# private method `new' called for SingletonObject:Class (NoMethodError)
# ↑ newでのインスタンスの作成に失敗

🏈 どんなときに使うの?

  • アプリケーションで一度だけ読めばいい設定ファイルの内容のコンテナなど
  • コネクションプーリングのように作成したインスタンスをプールして使いまわすとき

👽 Singletonの課題

Singletonには次のような課題があるため、安易に使わず、必要な箇所に使うようにすべきです。

  • グローバル変数の代わりになると、複数箇所で変更されるとカオスになる
  • コードが密結合になりやすく、テストを書きづらくなる

🚕 GitHubリポジトリ

🎉 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍