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

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

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

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

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

 

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

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

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