作用:用来帮助配置复杂对象的模式。理解:生成器就是一种多部件的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

results matching ""

    No results matching ""