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设计模式》以通俗易懂的方式介绍了Ruby设计模式,主要包括Ruby概述、使用模板方法变换算法、使用策略替换算法、通过观察器保持协调、通过迭代器遍历集合、使用命令模式完成任务、使用适配器填补空隙、使用装饰...
本书以通俗易懂的方式介绍了Ruby设计模式,主要包括Ruby概述、使用模板方法变换算法、使用策略替换算法、通过观察器保持协调、通过迭代器遍历集合、使用命令模式完成任务、使用适配器填补空隙、使用装饰器改善对象、...
春节巨献,绝对超值!!!!!
ruby设计模式是2009年出版的,目前已经断货。网上多是影印版,跟正版售价差不多,买一本影印的,的确划不来。也很少有电子中文版的,发个资源,提供点方便给大家。
创建型模式如单例模式(Singleton)、工厂方法(Factory Method)和建造者模式(Builder)等,主要关注对象的创建过程,提供了一种在不指定具体类的情况下创建对象的方法。例如,Ruby中的Singleton模块可以轻松实现...
Ruby中的装饰器模式是一种设计模式,它允许我们动态地向对象添加新的行为或职责,而无需修改原有类的代码。这种模式比继承更加灵活,因为它可以在运行时改变对象的行为,而不是在编译时通过类继承来实现。装饰器模式...
适配器模式是软件设计模式中的一种,它的主要目的是解决不同接口之间的兼容性问题,使得原本不兼容的类或接口能够协同工作。在Ruby这样的动态类型语言中,虽然类型检查不是强制性的,但适配器模式仍然有其重要的应用...
开发者可以通过自定义 `config.gen` 文件,根据项目需求调整生成的代码结构,使代码更符合项目规范和设计模式。在 Ruby 开发环境中,这样的工具无疑提升了开发体验,降低了出错的可能性,值得在实际工作中探索和使用...
"Ruby中的GoF设计模式实现"是指在Ruby编程语言中应用Gang of Four(GoF)设计模式。GoF设计模式是四本同名书籍中的核心概念,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者提出,书中总结了...
**代理模式**是一种结构型设计模式,它创建了一个拥有与目标对象相同接口的代理对象,代理对象在客户端和目标对象之间起到中介作用,可以控制对目标对象的访问,或者在调用目标对象的同时添加额外的功能。在Ruby中,...
建造者(Builder)模式是设计模式的一种,它将复杂对象的构造过程与对象的表示分离,使得同样的构建过程可以创建不同的表示。这在处理具有多个组成部分的复杂对象时尤其有用,因为可以通过改变建造者来改变对象的...
《Ruby面向对象设计实践》介绍了一些常用的设计模式,如工厂模式、单例模式、策略模式等,帮助开发者更好地组织代码结构,提高代码的可读性和可维护性。 #### 四、实战案例分析 书中通过具体的案例来展示如何运用...
本书《Ruby面向对象设计:Practical Object-Oriented Design in Ruby》是一本专注于Ruby编程语言中面向对象设计原则和技术的书籍。作者Sandi Metz在书中讲述了如何应用敏捷方法来设计高质量、易于维护和扩展的面向...
`GoOnRails`是专门为Rails开发者设计的一个生成器,它允许在Rails应用中集成Go代码,创建Go API服务。这个工具简化了在Rails项目中使用Go进行后端处理的流程,使开发者可以利用Go的性能优势处理高并发请求,同时保留...
处理对象创建机制的设计模式,尝试以适合情况的方式创建对象。 - 用于创建和使用相关/依赖对象系列 - 用于逐步创建不同类型的复杂对象 - 用于从许多对象中创建一种可以代替它使用的对象 - 接下来。 - 即将推出...
标题 "用ruby读excel文件生成xml文件" 描述的是一项技术任务,即使用Ruby编程语言来处理Excel文件,并将其内容转换成XML格式。这在数据迁移、格式转换或与不支持Excel格式的应用程序进行数据交换时非常有用。Ruby库...
Ruby,作为一门动态、灵活的面向对象语言,其设计模式不仅包含经典的面向对象模式,还可能涵盖一些针对其特性的独特模式。 1. **单例模式**:在Ruby中,单例类(Singleton)用于确保一个类只能有一个实例。通常,...
之前有看过《ruby设计模式》,不过渐渐的都忘记了。现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下。 简单工厂模式: # -*- encoding: utf-8 -*- #运算类 class Operation attr_...