RubyのSimple FactoryパターンとFactory Methodパターンを利用する
2022-02-01 15:14:26
以前、Ruby Design Patternsを読んだことがあるのですが、だんだん忘れてしまいました。今回、デザインパターンについて大々的に語られていて、それほどつまらなくはなさそうなので買って、ついでにRubyでコードを実装してみた。
シンプルなファクトリーパターン。
# -*- encoding: utf-8 -*-
# Operation class
class Operation
attr_accessor :number_a,:number_b
def initialize(number_a = nil, number_b = nil)
@number_a = number_a
@number_b = number_b
end
def result
0
end
end
#addition class
class OperationAdd < Operation
def result
number_a + number_b
end
end
# Subtraction class
class OperationSub < Operation
def result
number_a - number_b
end
end
# Multiplication class
class OperationMul < Operation
def result
number_a * number_b
end
end
# Division class
class OperationDiv < Operation
def result
raise 'divisor cannot be 0' if number_b == 0
number_a / number_b
end
end
# Factory class
class OperationFactory
def self.create_operate(operator)
case operate
when '+'
OperationAdd.new()
when '-'
OperationSub.new()
when '*'
OperationMul.new()
when '/'
OperationDiv.new()
end
end
end
oper = OperationFactory.create_operate('/')
oper.number_a = 1
oper.number_b = 2
p oper.result
このように書くと、カップリングが減るという利点があります。
例えば、open-root操作を追加する場合、ファクトリークラスに分岐を追加してopen-rootクラスを新規に作成するだけで、他のクラスには手を付けずに済みます。
ファクトリーメソッドパターン。
# -*- encoding: utf-8 -*-
# Operation class
class Operation
attr_accessor :number_a,:number_b
def initialize(number_a = nil, number_b = nil)
@number_a = number_a
@number_b = number_b
end
def result
0
end
end
#addition class
class OperationAdd < Operation
def result
number_a + number_b
end
end
# Subtraction class
class OperationSub < Operation
def result
number_a - number_b
end
end
# Multiplication class
class OperationMul < Operation
def result
number_a * number_b
end
end
# Division class
class OperationDiv < Operation
def result
raise 'divisor cannot be 0' if number_b == 0
number_a / number_b
end
end
module FactoryModule
def create_operation
end
end
# Adding Factory
class AddFactory
include FactoryModule
def create_operation
OperationAdd.new
end
end
#Subtraction Factory
class SubFactory
include FactoryModule
def create_operation
OperationSub.new
end
end
#MultiplicationFactory
class MulFactory
include FactoryModule
def create_operation
OperationMul.new
end
end
# Divide Factory
class DivFactory
include FactoryModule
def create_operation
OperationDiv.new
end
end
factory = AddFactory.new
oper = factory.create_operation
oper.number_a = 1
oper.number_b = 2
p oper.result
単純なファクトリーパターンと比較すると、ファクトリークラスが削除され、具体的な算術ファクトリー、すなわち加算ファクトリー、減算ファクトリー、乗算ファクトリー、除算ファクトリーに置き換えられていることが変更点として挙げられます。
関連
-
ruby on railsのモデルアソシエーションについて解説
-
Rubyのブロック機能をより深く理解するために
-
Rubyの文法と言語機能のまとめ
-
Nokogiriパッケージを使ってXML形式のデータを操作するためのRubyチュートリアル
-
Ruby は REXML ライブラリを使って xml 形式のデータをパースする
-
Rubyのデザインパターンプログラミングにおけるコマンドパターンの活用を徹底分析
-
RubyのTimeオブジェクトの共通機能まとめ
-
Rubyの文字列と配列の最大化問題の考察
-
Rubyバージョン管理ツールRVMのインストールとチュートリアルの使用方法
-
Ruby on RailsでMarkdownを使用する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン