rubyでデザインパターン builderパターン

砂糖水を作る(
ビルダ (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