Ruby中使用设计模式中的简单工厂模式和工厂方法模式
之前有看过《ruby设计模式》,不过渐渐的都忘记了。现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下。
简单工厂模式:
#-*-encoding:utf-8-*-
#运算类
classOperation
attr_accessor:number_a,:number_b
definitialize(number_a=nil,number_b=nil)
@number_a=number_a
@number_b=number_b
end
defresult
0
end
end
#加法类
classOperationAdd<Operation
defresult
number_a+number_b
end
end
#减法类
classOperationSub<Operation
defresult
number_a-number_b
end
end
#乘法类
classOperationMul<Operation
defresult
number_a*number_b
end
end
#除法类
classOperationDiv<Operation
defresult
raise'除数不能为0'ifnumber_b==0
number_a/number_b
end
end
#工厂类
classOperationFactory
defself.create_operate(operate)
caseoperate
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
poper.result
这样写的好处是降低耦合。
比如增加一个开根号运算的时候,只需要在工厂类中添加一个分支,并新建一个开根号类,不会去动到其他的类。
工厂方法模式:
#-*-encoding:utf-8-*- #运算类 classOperation attr_accessor:number_a,:number_b definitialize(number_a=nil,number_b=nil) @number_a=number_a @number_b=number_b end defresult 0 end end #加法类 classOperationAdd<Operation defresult number_a+number_b end end #减法类 classOperationSub<Operation defresult number_a-number_b end end #乘法类 classOperationMul<Operation defresult number_a*number_b end end #除法类 classOperationDiv<Operation defresult raise'除数不能为0'ifnumber_b==0 number_a/number_b end end moduleFactoryModule defcreate_operation end end #加法工厂 classAddFactory includeFactoryModule defcreate_operation OperationAdd.new end end #减法工厂 classSubFactory includeFactoryModule defcreate_operation OperationSub.new end end #乘法工厂 classMulFactory includeFactoryModule defcreate_operation OperationMul.new end end #除法工厂 classDivFactory includeFactoryModule defcreate_operation OperationDiv.new end end factory=AddFactory.new oper=factory.create_operation oper.number_a=1 oper.number_b=2 poper.result
相比于简单工厂模式,这里的变化是移除了工厂类,取而代之的是具体的运算工厂,分别是加法工厂、减法工厂、乘法工厂和除法工厂。