Slide 45
Slide 45 text
class CoffeeMachine
def vend(drink: :coffee, options: {})
BeverageFactory.build(drink, options).prepare
end
end
class BeverageFactory
def self.build(key, options)
beverage_class(key).new(options)
end
def self.register(key, klass)
beverages[key] = klass
end
def self.beverage_class(key)
beverages[key] || NullBeverage
end
def self.beverages
@beverages ||= {}
end
end
class NullBeverage < Beverage
def prepare
# no-op
end
end
# {
# :coffee => Coffee,
# :tea => Tea,
# :cocoa => Cocoa
# )
class Coffee < Beverage
BeverageFactory.register(:coffee, self)
def prepare
dispense_cup
heat_water
prepare_grounds
dispense_water
dispense_sweetener if sweet?
dispense_cream if creamy?
dispense_whipped_cream if fluffy?
dispose_of_grounds
end
end
class Tea < Beverage
BeverageFactory.register(:tea, self)
def prepare
dispense_cup
heat_water
dispense_tea_bag
dispense_water
dispense_sweetener if sweet?
dispense_cream if creamy?
end
end
class Cocoa < Beverage
BeverageFactory.register(:cocoa, self)
def prepare
dispense_cup
heat_water
dispense_cocoa_mix
dispense_water
dispense_whipped_cream if fluffy?
end
end
☕ Refactor: Introduce self-registration