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

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

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

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

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

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

  • 相关阅读:
    树莓派linux驱动学习之hello world
    android通过服务实现消息推送
    [转载] iOS开发分辨率那点事
    《裸辞的程序猿漂流记十四》——升级站点
    typedef 总结
    苹果 App Store 申请和管理相关知识
    判断系统是12小时制还是24小时制
    解决 UIView 设置背景为UIImage图片变型问题[XXX setBackgroundColor:[UIColor colorWithPatternImage:XXX]];
    免费iOS第三方推送工具Urban Airship使用教程
    sizeWithFont:方法使用明细
  • 原文地址:https://www.cnblogs.com/fanxiaopeng/p/4198748.html
Copyright © 2020-2023  润新知