zoukankan      html  css  js  c++  java
  • 《大话设计模式》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

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

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

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

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

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

  • 相关阅读:
    http与https的区别以及https的加密原理
    android 网络之 httppost
    android 定时器与Canvas结合使用
    逛超市遇到问题了还是好心人多
    获取最新前十篇文章
    做菜 蒸鸡蛋
    使用ASP.NET 2.0 Profile存储用户信息_1[翻译] Level 200
    ajax 笔记不用刷新实现数据的分页显示 2 (上)
    在人力资源树当中,上级对下级员工信息查看修改操作。
    今年入冬于来的第一场雪
  • 原文地址:https://www.cnblogs.com/fanxiaopeng/p/4198748.html
Copyright © 2011-2022 走看看