之前有看過《ruby設計模式》,不過漸漸的都忘記了。現在買了一個大話設計模式,看起來不是那麼枯燥,順便將代碼用ruby實現了一下。
簡單原廠模式:
# -*- encoding: utf-8 -*-#運算類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 endend#加法類class OperationAdd < Operation def result number_a + number_b endend#減法類class OperationSub < Operation def result number_a - number_b endend#乘法類class OperationMul < Operation def result number_a * number_b endend#除法類class OperationDiv < Operation def result raise '除數不能為0' if number_b == 0 number_a / number_b endend#工廠類class OperationFactory def self.create_operate(operate) case operate when '+' OperationAdd.new() when '-' OperationSub.new() when '*' OperationMul.new() when '/' OperationDiv.new() end endendoper = OperationFactory.create_operate('/')oper.number_a = 1oper.number_b = 2p oper.result
這樣寫的好處是降低耦合。
比如增加一個開根號運算的時候,只需要在工廠類中添加一個分支,並建立一個開根號類,不會去動到其他的類。
Factory 方法模式:
# -*- encoding: utf-8 -*-#運算類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 endend#加法類class OperationAdd < Operation def result number_a + number_b endend#減法類class OperationSub < Operation def result number_a - number_b endend#乘法類class OperationMul < Operation def result number_a * number_b endend#除法類class OperationDiv < Operation def result raise '除數不能為0' if number_b == 0 number_a / number_b endendmodule FactoryModule def create_operation endend#加法工廠class AddFactory include FactoryModule def create_operation OperationAdd.new end end#減法工廠class SubFactory include FactoryModule def create_operation OperationSub.new endend#乘法工廠class MulFactory include FactoryModule def create_operation OperationMul.new end end#除法工廠class DivFactory include FactoryModule def create_operation OperationDiv.new end endfactory = AddFactory.newoper = factory.create_operationoper.number_a = 1oper.number_b = 2p oper.result
相比於簡單原廠模式,這裡的變化是移除了工廠類,取而代之的是具體的運算工廠,分別是加法工廠、減法工廠、乘法工廠和除法工廠。