当前位置 博文首页 > Ruby设计模式编程中使用Builder建造者模式的实例

    Ruby设计模式编程中使用Builder建造者模式的实例

    作者:范孝鹏 时间:2021-02-03 06:13

    先来复习一下设计模式的基本概念:
    定义
    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
    建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要重新定一个建造者就可以了。
    实用范围
    1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
    2.当构造过程必须允许被构造的对象有不同表示时。
    角色
    在这样的设计模式中,有以下几个角色:
    1.builder:为创建一个产品对象的各个部件指定抽象接口。
    2.ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
    3.Director:构造一个使用Builder接口的对象。
    4.Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
    下面我们来看一个实例:
    需求:

    画一个小人,有头,有身体,两手两脚即可。

    初始代码:

    # -*- encoding: utf-8 -*-
    
    #小人一
    puts '这是第一个小人'
    puts '小人一:头'
    puts '小人一:瘦身体'
    puts '小人一:双手'
    puts '小人一:双脚'
    
    #小人二
    puts '这是第二个小人'
    puts '小人二:头'
    puts '小人二:胖身体'
    puts '小人二:双手'
    puts '小人二:双脚'
    
    

    问题:代码重复,而且容易出错,缺胳膊少腿之类的。

    改进代码:

    # -*- encoding: utf-8 -*-
    
    #
    class PersionBuilder
      def head
        puts ''
      end
      def body
        puts ''
      end
      def arm
        puts ''
      end
      def leg
        puts ''
      end
    end
    
    #小人一
    class PersionThinBuilder < PersionBuilder
      def head
        puts '头'
      end
      def body
        puts '瘦身体'
      end
      def arm
        puts '双手'
      end
      def leg
        puts '双脚'
      end
    end
    #小人二
    class PersionFatBuilder < PersionBuilder
      def head
        puts '头'
      end
      def body
        puts '胖身体'
      end
      def arm
        puts '双手'
      end
      def leg
        puts '双脚'
      end
    end
    
    #指挥者类
    class PersionDirect
      def initialize(persion)
        @persion = persion
      end
      
      def create_persion
        @persion.head
        @persion.body
        @persion.arm
        @persion.leg
      end
    
    end
    puts '这是第一个小人'
    p1 = PersionThinBuilder.new
    pd1 = PersionDirect.new(p1)
    pd1.create_persion
    
    puts '这是第二个小人'
    p2 = PersionThinBuilder.new
    pd2 = PersionDirect.new(p2)
    pd2.create_persion
    
    
    

    js