Rubyでよく使うデザインパターン
Rubyには、オブジェクト指向プログラミングのデザインパターンを実現するための便利な機能が数多く用意されています。これらの機能をうまく活用することで、簡潔で効率的なコードを書くことができます。本記事では、Rubyでよく使われるデザインパターンとその使い方について解説します。
1. Iterator (反復子)
Iteratorは、リストなどのデータ構造の要素に順番にアクセスするための方法を提供するパターンです。Rubyでは、「Enumerable」というモジュールを使うことで簡単に実現することができます。Enumerableモジュールは、eachメソッドを定義することでリストなどの要素にアクセスすることができます。
# Enumerableを使った反復子の例
class Book
include Enumerable
def initialize(title, author)
@title = title
@author = author
@pages = []
end
def <<(page)
@pages << page
end
def each
@pages.each { |page| yield page }
end
end
book = Book.new("Ruby on Rails", "David Heinemeier Hansson")
book << "Page 1"
book << "Page 2"
book << "Page 3"
book.each do |page|
puts page
end
2. Factory Method (ファクトリーメソッド)
Factory Methodは、オブジェクトの生成方法をカプセル化するパターンです。Rubyでは、クラスメソッドを用いてFactory Methodを実現することができます。クラスメソッドを使うことで、オブジェクト生成のロジックをクラス内部に封じ込めることができます。
# Factory Methodの例
class Person
def self.create(name)
if name == "Tom"
return Man.new(name)
elsif name == "Lisa"
return Woman.new(name)
end
end
end
class Man < Person
def initialize(name)
@name = name
end
def gender
"Male"
end
end
class Woman < Person
def initialize(name)
@name = name
end
def gender
"Female"
end
end
person1 = Person.create("Tom")
person2 = Person.create("Lisa")
puts person1.gender
puts person2.gender
3. Observer (観察者)
Observerは、オブジェクトの状態変化を監視し、変化があったときに通知するパターンです。Rubyでは、「Observable」というモジュールを使うことで簡単にObserverを実現することができます。Observableモジュールは、add_observerメソッド、delete_observerメソッド、notify_observersメソッドを定義しています。
# Observableを使ったObserverの例
require 'observer'
class Data
include Observable
def add_data(data)
@data = data
changed
notify_observers(self, @data)
end
end
class Display
def update(data, message)
puts "Data changed: #{message}"
end
end
data_object = Data.new
data_object.add_observer(Display.new)
data_object.add_data("Data 1")
data_object.add_data("Data 2")
data_object.add_data("Data 3")
4. Singleton (シングルトン)
Singletonは、クラスが唯一のインスタンスしか持たないようにするパターンです。Rubyでは、「Singleton」というモジュールを使うことで簡単にシングルトンを実現することができます。このモジュールは、クラスメソッド「instance」を定義しています。
# Singletonを使ったシングルトンの例
require 'singleton'
class AppConfig
include Singleton
def initialize
@properties = {}
end
def set_property(key, value)
@properties[key] = value
end
def get_property(key)
@properties[key]
end
end
config1 = AppConfig.instance
config1.set_property("key1", "value1")
config2 = AppConfig.instance
puts config2.get_property("key1")
5. Strategy (ストラテジー)
Stratgeyは、アルゴリズムをカプセル化し、それぞれを独立に切り替えて使えるようにするパターンです。Rubyでは、ブロックを使うことでStratgeyを実現することができます。ブロックを引数として受け取るメソッドを定義することで、異なるアルゴリズムを簡単に切り替えることができます。
# ブロックを使ったStrategyの例
class Printer
def perform(&strategy)
strategy.call
end
end
printer = Printer.new
printer.perform { puts "Method 1" }
printer.perform { puts "Method 2" }
以上、Rubyでよく使われるデザインパターンとその使い方について解説しました。これらのパターンを使うことで、プログラムの拡張性、再利用性、保守性を高めることができます。Rubyの機能を活かして、より効率的で簡潔なコードを書けるようになりましょう。
参考リンク:
Rubyでよく使われるデザインパターン
目からウロコのRubyにおけるデザインパターン
Rubyのシングルトンクラス(Singleton class)