代码示例
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
class OperationAdd < Operation
def result
number_a + number_b
end
end
class OperationSub < Operation
def result
number_a - number_b
end
end
class OperationMul < Operation
def result
number_a * number_b
end
end
class OperationDiv < Operation
def result
raise "除数不能为0" if number_b == 0
number_a / number_b
end
end
#工厂类
module FactoryModule
def create_operation
end
end
class AddFactory
include FactoryModule
def create_operation
OperationAdd.new
end
end
class SubFactory
include FactoryModule
def create_operation
OperationSub.new
end
end
class MulFactory
include FactoryModule
def create_operation
OperationMul.new
end
end
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
相比简单工厂模式,工厂方法模式移除了工厂类,取而代之的是具体的运算工厂,分别是加法工厂、减法工厂、乘法工厂和除法工厂。
工厂方法模式是将决定使用哪个类放在子类中的用法,上面中使用module的形式来实现代码复用,其实也可以用父类的形式,使用父类和子类的形式是比较典型和直接的工厂方法模式。
#其他代码相同,改写module成为父类,并且其他工厂类都是该父类的子类
class Factory
def create_operation
end
end
class AddFactory < Factory
def create_operation
OperationAdd.new
end
end
class SubFactory < Factory
def create_operation
OperationSub.new
end
end
class MulFactory < Factory
def create_operation
OperationMul.new
end
end
class DivFactory < Factory
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