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')
分享到:
相关推荐
在Ruby的世界里,设计模式(Design Patterns)是解决软件工程中常见问题的一种可复用解决方案。根据提供的文件信息,我们深入探讨一下GoF(Gang of Four)设计模式在Ruby中的应用,这将涵盖创建型、结构型以及行为型...
例如,我们可以使用工厂模式来创建对象,根据不同的条件生成不同类型的实例,避免了硬编码和紧密耦合。单例模式在需要全局唯一实例的场景中非常有用,比如数据库连接管理。而装饰器模式则可以动态地给对象添加新的...
【标题】: "基于JavaFX8的图形界面Vert.x代码生成器" 【描述】: 这个项目是一个利用JavaFX8技术构建的图形用户界面工具,它的主要功能是自动生成Vert.x框架相关的代码。Vert.x是一个轻量级、高性能、反应式应用开发...
中间件是一种插件式的设计模式,允许开发者在应用的请求/响应链中插入自定义的处理逻辑。这些中间件可以用于日志记录、错误处理、安全性增强、性能优化等多种用途。通过这种方式,开发者可以非常灵活地定制和扩展...
Rails的表单构建器简化了表单创建过程,渲染器则用于将数据渲染为不同的视图格式,而railties则是Rails框架的核心部分,用于初始化、配置和启动Rails应用。 《Rails初学者指南》为初学者提供了一个全面、系统的学习...
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 ...