《大话设计模式》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

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

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

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

 

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

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

你可能感兴趣的:(工厂方法模式)