標籤:
一,先看看簡單原廠模式
簡單原廠模式的優點:工廠類中包含了必要的邏輯判斷,根據用戶端的選擇動態執行個體化相關的類,對於用戶端來說,去除了與具體產品的依賴。
簡單原廠模式的缺點:增加功能的時候,就需要增加case的條件分支,也就是要修改工廠類,違背了“開放-封閉原則”。
2,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
相比於簡單原廠模式,這裡的變化是移除了工廠類,取而代之的是具體的運算工廠,分別是加法工廠、減法工廠、乘法工廠和除法工廠。
Factory 方法模式:定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類。Factory 方法是一個類的執行個體化延遲到了子類。
Factory 方法模式實現時,用戶端決定執行個體化哪一個工廠來實現運算類,選擇判斷的問題還是存在,也就是說,Factory 方法把簡單工廠的內部邏輯判斷轉移到了用戶端代碼來進行。想要增加功能,本來是修改工廠類,現在是修改用戶端。
這麼做的好處是,克服了簡單工廠違背“開放-封閉原則”的缺點,又保持了封裝對象建立過程的優點。
存在的問題是邏輯分支的判斷依然需要實現,只不過是從工廠類中轉移到了用戶端,利用”反射“可以解決分支判斷的問題。
《大話設計模式》ruby版代碼:Factory 方法模式