砂糖水を作る(
ビルダ (Builder) | Ruby デザインパターン | 酒と涙とRubyとRailsと
)
こちらの写生です。
操作と手順を分離するパターンです。
factoryパターンとの大きな違いは、factoryパターンは作成が1ステップでできる場合に使うのに対し、builderパターンは作成に複数のステップを踏む場合に使う点。
class SugarWater attr_accessor :water, :sugar def initialize(water, sugar) @water = water @sugar = sugar end end class SugarWaterBuilder def initialize @sugar_water = SugarWater.new(0,0) end def add_sugar(sugar_amount) @sugar_water.sugar += sugar_amount end def add_water(water_amount) @sugar_water.water += water_amount end def result @sugar_water end end class Director def initialize(builder) @builder = builder end def cook @builder.add_water(150) @builder.add_sugar(90) @builder.add_water(300) @builder.add_sugar(35) end end builder = SugarWaterBuilder.new director = Director.new(builder) director.cook p builder.result ####################別の例##################### class Burger attr_reader :size, :cheese, :lettuce, :tomato, :pepperoni def initialize(builder) @size = builder.size @cheese = builder.cheese @lettuce = builder.lettuce @tomato = builder.tomato end end class BurgerBuilder attr_reader :size, :cheese, :lettuce, :tomato, :pepperoni def initialize(size) @size = size end def addPepperoni @pepperoni = true end def addLettuce @lettuce = true end def addCheese @cheese = true end def addTomato @tomato = true end def build Burger.new(self) end end burgar = BurgerBuilder.new(14) burgar.addTomato burgar.addCheese tomato_cheese_burgar = burgar.build p tomato_cheese_burgar