1つずつデザインパターンをまとめ
総論
パターンそのものと使い所を理解する
Singleton(シングルトン)パターン
唯一のオブジェクト、グローバルアクセスを実現するパターン
あるクラスからは1つしかインスタンスを生成できない事を保証することでアクセスはどこからでもできるようにするパターン
Singletonのテンプレート
ParentSingleton.rb
require 'singleton'
class ParentSingleton
attr_reader :settings
def initialize
@settings = {property: 'value'}
end
end
ParentSingleton.rb
require './SubSingleton'
class SubSingleton < ParentSingleton
include Singleton
end
main.rb
require './SubSingleton'
class Main
object1 = SubSingleton.instance
puts(object1.settings[:property])
object2 = SubSingleton.instance
puts(object2.settings[:property])
end
使い所
主なのは以下3点
- ログ(logger)
- 設定情報(settings)
- DB接続機構(conection pooling)
特徴
- Railsとか使うとあんまり自分自身が実装する所ない(必要そうな箇所は既に提供されている)
- グローバルなのでちゃんと理解しないと使えないといわれがちな為、使いにくい
- Rubyには標準のsingletonモジュールで提供されている
- テストにおいて依存問題が発生し易い
- クラスの結合度が高くなる
考え方
- singletonモジュールの内部ではstaticにインスタンスを保持し、呼び出し側ではその保持されたインスタンスのみを取得することで状態を保持し続けているオブジェクトを取得する
- またコンストラクタしようとするとエラーが発生する(べき)
ポイント
- Rubyで自身で実装しようとすると、言語特性上の問題もあり、singletonを満す実装自体が大変
- 既存のsingletonメソッドを利用する場合果たしてそれを呼び出して良い場所なのか吟味する必要がある
書籍情報
Russ Olsen, Rubyによるデザインパターン
https://amzn.to/2PFKt6m
雑感
作る、使えるかは置いといて、ひとまず知っといておくべき系パターンと解釈