酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

シングルトン Ruby 2.0.0 デザインパターン速攻習得[Singleton][Design Pattern]

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

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


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

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

サンプルソース

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
# Singletonは、Mix-inしたクラスのinstanceは同一のインスタンスを返すようになる
require 'singleton'

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

  def initialize
    @counter = 0
  end
end

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

1
2
3
4
5
6
7
8
9
10
obj1 = SingletonObject.instance
obj1.counter += 1
puts(obj1.counter)
# 1

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

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

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

説明は以上です。 このサンプルソースはGitHubにも置いています。

サンプルソース(GitHub)

Special Thanks

Singleton - Murayama Blog.

デザインパターン-Singleton

シングルトンパターン

Amazon.co.jp: Rubyによるデザインパターン: Russ Olsen, ラス・オルセン, 小林 健一, 菅野 裕, 吉野 雅人, 山岸 夢人, 小島 努: 本

変更来歴

12/10 09:00 GitHubへのサンプルソースの設置。導入文の修正
12/11 00:00 書籍へのリンクをAmazon アフィリエイトに変更
12/11 15:00 GoFのシングルトンの前提条件/ソースコードの説明文を追加
06/21 17:40 Ruby2.0.0対応、読みづらい部分を修正

おすすめの書籍