`
zqjshiyingxiong
  • 浏览: 440235 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

RUBY设计模式之生成器模式Builder(简化对象的创建)

    博客分类:
  • RUBY
阅读更多

 

Builder class 负责将所有的部件瓶装于一个复杂的对象中。

 

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

14.2 生成器模式 UML 类图:

 

 

14.3应用场景:

1 、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

2 、当构造过程必须允许被构造的对象有不同的表示时。

 

14.4生成器模式分析与实现(ruby 描述):

 

class Computer
  attr_accessor :display
  attr_accessor :motherboard
  attr_accessor :drives
  
  def initialize(display=:crt, motherboard=Motherboard.new, drives=[])
    @motherboard = motherboard
    @display = display
    @drives = drives
  end
end

class CPU
end

class TurboCPU < CPU
  
end

class BasicCPU < CPU

end

class Motherboard
  attr_accessor :cpu
  attr_accessor :memory_size
  
  def initialize(cpu=BasicCPU.new,memory_size=1000)
    @cpu = cpu
    @memory_size =memory_size
  end
end

class Drive
  attr_reader :type
  attr_reader :size
  attr_reader :writable
  
  def initialize(type, size, writable)
    @type = type
    @size = size
    @writable = writable
  end
end

#
# 这是我们来创建一台非常好的计算机
#
motherboard = Motherboard.new(TurboCPU.new,4000)

drives = []
drives << Drive.new(:hard_drive, 200000,true)
drives << Drive.new(:hard_drive, 200000,true)
drives << Drive.new(:hard_drive, 200000,true)
drives << Drive.new(:cd, 200,true)

computer = Computer.new(:lcd,motherboard,drives)

#
# 这时,我们可能还没有发现问题,因为我们才刚刚创建了一台电脑,比如我们现在要开网吧,我们需要一百台点配置不同的电脑,我想大家就要挠头了
# 现在看看我们用生成器会带来什么好处吧
#

class ComputerBuilder
  attr_reader :computer
  def initialize
    @computer = Computer.new
  end
  
  def turbo(has_turbo_cpu=true)
    @computer.motherboard.cpu = TurboCPU.new
  end
  
  def display=(display)
    @computer.display=display
  end
  
  def memory_size=(size_in_mb)
    @computer.motherboard.memory_size = size_in_mb
  end
  
  def add_cd(writer=false)
    @computer.drives << Drive.new(:cd,760,writer)
  end
  
  def add_dvd(writer=false)
    @computer.drives << Drive.new(:dvd, 4000, writer)
  end
  
  def add_hard_disk(size_in_mb)
    @computer.drives << Drive.new(:hard_work,size_in_mb,true)
  end
end

builder = ComputerBuilder.new
builder.turbo
builder.add_cd(true)
builder.add_dvd
builder.add_hard_disk(1000000000)

computer = builder.computer

#
# 通过电脑生成器,我们可以生成我们想要的电脑的了,就想我们去组装店一样,告诉他们我们想要的配置,他们安装我的要求,不一会就帮我组装了
# 我想要的电脑,真实太棒了,在RUBY中有种魔法方法来写错的生成器,我们来看看吧
#

def method_missing(name, *args)
  words = name.to_s.split("_")
  return super(name, *args) unless words.shift == 'add'
  words.each do |word|
    next if word == 'and'
    add_cd if word == 'cd'
    add_dvd if word== 'dvd'
    add_hard_disk if word == 'harddisk'
    turbo if word == 'turbo'
  end
end

builder.add_dvd_cd_harddisk

# or

builder.add_turbo_and_dvd_harddisk

#
# 魔法方法最杰出的应用是ActiveRecord中的查询方法
# Employee.find_by_ssn('123-34-333')
# 
# Employee.find_by_firstname_and_lastname('John', 'Smith')
 

分享到:
评论

相关推荐

    gof patterns in ruby

    在Ruby的世界里,设计模式(Design Patterns)是解决软件工程中常见问题的一种可复用解决方案。根据提供的文件信息,我们深入探讨一下GoF(Gang of Four)设计模式在Ruby中的应用,这将涵盖创建型、结构型以及行为型...

    design-patterns-group:Nascenia设计模式小组使用c#,ruby,java,php编写的示例应用程序的源代码存储库,您可以为其命名

    例如,我们可以使用工厂模式来创建对象,根据不同的条件生成不同类型的实例,避免了硬编码和紧密耦合。单例模式在需要全局唯一实例的场景中非常有用,比如数据库连接管理。而装饰器模式则可以动态地给对象添加新的...

    基于javafx8开发的图形界面Vert.x代码生成器,使用 Apache Fre.zip

    【标题】: "基于JavaFX8的图形界面Vert.x代码生成器" 【描述】: 这个项目是一个利用JavaFX8技术构建的图形用户界面工具,它的主要功能是自动生成Vert.x框架相关的代码。Vert.x是一个轻量级、高性能、反应式应用开发...

    rack教程(ruby)

    中间件是一种插件式的设计模式,允许开发者在应用的请求/响应链中插入自定义的处理逻辑。这些中间件可以用于日志记录、错误处理、安全性增强、性能优化等多种用途。通过这种方式,开发者可以非常灵活地定制和扩展...

    rails-beginner-s-guide

    Rails的表单构建器简化了表单创建过程,渲染器则用于将数据渲染为不同的视图格式,而railties则是Rails框架的核心部分,用于初始化、配置和启动Rails应用。 《Rails初学者指南》为初学者提供了一个全面、系统的学习...

    Scala程序设计(第2版)

    3.6.2 生成器表达式 67 3.6.3 保护式:筛选元素 67 3.6.4 Yielding 68 3.6.5 扩展作用域与值定义 69 3.7 其他循环结构 70 3.7.1 Scala的while循环 71 3.7.2 Scala中的do-while循环 71 3.8 ...

Global site tag (gtag.js) - Google Analytics