《大话设计模式》ruby版代码:工厂方法模式

一,先看看简单工厂模式

简单工厂模式的优点:工厂类中包含了必要的逻辑判断,根据客户端的选择动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

简单工厂模式的缺点:增加功能的时候,就需要增加case的条件分支,也就是要修改工厂类,违背了“开放-封闭原则”。

2,工厂方法模式:

# -*- 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
    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

相比于简单工厂模式,这里的变化是移除了工厂类,取而代之的是具体的运算工厂,分别是加法工厂、减法工厂、乘法工厂和除法工厂。

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到了子类。

工厂方法模式实现时,客户端决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在,也就是说,工厂方法把简单工厂的内部逻辑判断转移到了客户端代码来进行。想要增加功能,本来是修改工厂类,现在是修改客户端。

 

这么做的好处是,克服了简单工厂违背“开放-封闭原则”的缺点,又保持了封装对象创建过程的优点。

存在的问题是逻辑分支的判断依然需要实现,只不过是从工厂类中转移到了客户端,利用”反射“可以解决分支判断的问题。

posted @ 2015-01-02 20:05  范孝鹏  阅读(569)  评论(0编辑  收藏  举报