1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

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



単純なファクトリーパターンと比較すると、ファクトリークラスが削除され、具体的な算術ファクトリー、すなわち加算ファクトリー、減算ファクトリー、乗算ファクトリー、除算ファクトリーに置き換えられていることが変更点として挙げられます。