作用:用来帮助配置复杂对象的模式。理解:生成器就是一种多部件的new方法,在这种方法中对象不是一次性创建的,而是在一个扩展的处理中被创建的。区别于组合模式。
生成器中的概念:产品(生成器生成的对象),指导者(指导生成器生成对象,就是人)
uml
代码示例:computer由display, motherboard, drives组成,其中motherboard由cpu和memory_size组成,drive的参数包括type, size, writable, display的选择crt和lcd两种选择。ComputerBuilder是生成器模式,帮助配置computer这个对象。
class CPU
#通用CPU
end
class TurboCPU < CPU
#告诉CPU
end
class BasicCPU < CPU
#普通CPU
end
class Motherboard
attr_accessor :cpu, :memory_size
def initialize(cpu=BasicCPU.new, memory_size=1000)
@cpu = cpu
@memory_size = memory_size
end
end
class Drive
attr_reader :type, :size, :writable
def initialize(type, size, writable)
@type = type
@size = size
@writable = writable
end
end
class Computer
attr_accessor :display, :motherboard
attr_reader :drives
def initialize(display=:crt, motherboard=Motherboard.new, drives=[])
@motherboard = motherboard
@drives = drives
@display = display
end
end
class ComputerBuilder
attr_reader :computer
def initialize
@computer = Computer.new
end
def turbo
@computer.motherboard.cpu = TurboCPU.new
end
def display=(display)
@computer.display = display
end
def memory_size=(memory_size)
@computer.motherboard.memory_size = memory_size
end
def add_cd
@computer.drives << Drive.new(:cd, 4000, true)
end
end
builder = ComputerBuilder.new
builder.turbo
builder.display = :cc_display
builder.memory_size= 10000
builder.add_cd
p builder
##<ComputerBuilder:0x007fd1988ca3e0 @computer=#<Computer:0x007fd1988ca3b8
@motherboard=#<Motherboard:0x007fd1988ca390 @cpu=#<TurboCPU:0x007fd1988ca318>,
@memory_size=10000>, @drives=[#<Drive:0x007fd1988ca2f0 @type=:cd, @size=4000, @writable=true>],
@display=:cc_display>>
对上面的ComputerBuilder进行补全,
class ComputerBuilder
#判断生成的对象是否合适
def computer
raise "not enough memory" if @computer.motherboard.memory_size<4000
@computer
end
#重置对象
def reset
@computer = Computer.new
end
end