2009-05-06 :-)
_ 朝ッ
0730 起床
_ [デザインパターン][Factory]Head First デザインパターンを写経する - 4章 Factory パターン
#!/usr/bin/ruby -Ks
class PizzaStore
def orderPizza( type )
@pizza
@pizza = createPizza( type )
@pizza.prepare
@pizza.bake
@pizza.cut
@pizza.box
@pizza
end
def createPizza( type )
end
end
class NYPizzaStore < PizzaStore
def createPizza( item )
case item
when "チーズ"
NYStyleCheesePizza.new
## when "野菜"
## NYStyleVeggiePizza.new
## when "クラム"
## NYStyleClamPizza.new
## when "ペパロニ"
## NYStylePepperoniPizza.new
else
nil
end
end
end
class ChicagoPizzaStore < PizzaStore
def createPizza( item )
case item
when "チーズ"
ChicagoStyleCheesePizza.new
## when "野菜"
## ChicagoStyleVeggiePizza.new
## when "クラム"Head First デザインパターンを写経する - 3章 Decorator パターン
## ChicagoStyleClamPizza.new
## when "ペパロニ"
## ChicagoStylePepperoniPizza.new
else
nil
end
end
end
class CaliforniaPizzaStore < PizzaStore
def createPizza( item )
case item
when "チーズ"
CaliforniaStyleCheesePizza.new
when "野菜"
CaliforniaStyleVeggiePizza.new
when "クラム"
CaliforniaStyleClamPizza.new
when "ペパロニ"
CaliforniaStylePepperoniPizza.new
else
nil
end
end
end
class Pizza
@name
@dough
@sauce
@toppings
def prepare
puts "#{@name}を下処理"
puts "生地をこねる..."
puts "ソースを追加..."
puts "トッピングを追加:"
@toppings.each {|t|
puts " #{t}"
}
end
def bake
puts "350度で25分間焼く"
end
def cut
puts "ピザを扇形に切り分ける"
end
def box
puts "PizzaStore の正式な箱にピザを入れる"
end
def getName
@name
end
end
class NYStyleCheesePizza < Pizza
def initialize
@name = "ニューヨークスタイルのソース&チーズピザ"
@dough = "薄いクラスト生地"
@sauce = "マリナラソース"
@toppings = []
@toppings << "粉レッジャーノチーズ"
end
end
class ChicagoStyleCheesePizza < Pizza
def initialize
@name = "シカゴスタイルのディープディッシュチーズピザ"
@dough = "極厚クラスト生地"
@sauce = "プラムトマトソース"
@toppings = []
@toppings << "刻んだモッツァレラチーズ"
end
def cut
puts "ピザを四角形に切り分ける"
end
end
def main
nyStore = NYPizzaStore.new
chicagoStore = ChicagoPizzaStore.new
pizza = nyStore.orderPizza( "チーズ" )
puts "イーサンの注文は#{pizza.getName}"
pizza = chicagoStore.orderPizza( "チーズ" )
puts "ジョエルの注文は#{pizza.getName}"
end
main
% ./factory.rb ニューヨークスタイルのソース&チーズピザを下処理 生地をこねる... ソースを追加... トッピングを追加: 粉レッジャーノチーズ 350度で25分間焼く ピザを扇形に切り分ける PizzaStore の正式な箱にピザを入れる イーサンの注文はニューヨークスタイルのソース&チーズピザ シカゴスタイルのディープディッシュチーズピザを下処理 生地をこねる... ソースを追加... トッピングを追加: 刻んだモッツァレラチーズ 350度で25分間焼く ピザを四角形に切り分ける PizzaStore の正式な箱にピザを入れる ジョエルの注文はシカゴスタイルのディープディッシュチーズピザ
_ [デザインパターン][Abstract Factory]Head First デザインパターンを写経する - 4章 Abstract Factory パターン
素材クラスは途中で挫折したので全部は書いてない。
#!/usr/bin/ruby -Ks
module Veggies
def to_s
end
end
class Garlic
include Veggies
def to_s
"Garlic"
end
end
module Dough
def to_s
end
end
class ThinCrustDough
include Dough
def to_s
"ThinCrustDough"
end
end
class ThickCrustDough
include Dough
def to_s
"ThickCrustDough"
end
end
module PizzaIngredientFactory
def createDough
end
def createSauce
end
def createCheese
end
def createVeggies
end
def createPapperoni
end
def createClam
end
end
class NYPizzaIngredientFactory
include PizzaIngredientFactory
def createDough
ThinCrustDough.new
end
def createSauce
# MarinaraSauce.new
end
def createCheese
# ReggianoCheese.new
end
def createVeggies
# veggies = [ Garlic.new, Onion.new, Mushroom.new, RedPepper.new ]
end
def createPapperoni
# SlicedPepperoni.new
end
def createClam
# FreshClams.new
end
end
class ChicagoPizzaIngredientFactory
include PizzaIngredientFactory
def createDough
ThickCrustDough.new
end
def createSauce
# PlumTomatoSauce.new
end
def createCheese
# MozzarellaCheese.new
end
def createVeggies
# veggies = [ BlackOlives.new, Spinach.new, Eggplant.new ]
end
def createPapperoni
# SlicedPepperoni.new
end
def createClam
# FrozenClams.new
end
end
class PizzaStore
def orderPizza( type )
@pizza = createPizza( type )
@pizza.prepare
@pizza.bake
@pizza.cut
@pizza.box
@pizza
end
def createPizza( type )
end
end
class NYPizzaStore < PizzaStore
def createPizza( item )
pizza = nil
ingredientFactory = NYPizzaIngredientFactory.new
case item
when "チーズ"
pizza = CheesePizza.new( ingredientFactory )
pizza.setName( "ニューヨークスタイルチーズピザ" )
## when "野菜"
## pizza = VeggiePizza( ingredientFactory )
## pizza.setName( "ニューヨークスタイル野菜ピザ"
## when "クラム"
## pizza = ClamPizza( ingredientFactory )
## pizza.setName( "ニューヨークスタイルクラムピザ"
## when "ペパロニ"
## pizza = PepperoniePizza( ingredientFactory )
## pizza.setName( "ニューヨークスタイルペパロニピザ"
else
pizza = nil
end
pizza
end
end
class ChicagoPizzaStore < PizzaStore
def createPizza( item )
pizza = nil
ingredientFactory = ChicagoPizzaIngredientFactory.new
case item
when "チーズ"
pizza = CheesePizza.new( ingredientFactory )
pizza.setName( "ニューヨークスタイルチーズピザ" )
## when "野菜"
## pizza = VeggiePizza( ingredientFactory )
## pizza.setName( "ニューヨークスタイル野菜ピザ"
## when "クラム"
## pizza = ClamPizza( ingredientFactory )
## pizza.setName( "ニューヨークスタイルクラムピザ"
## when "ペパロニ"
## pizza = PepperoniePizza( ingredientFactory )
## pizza.setName( "ニューヨークスタイルペパロニピザ"
else
pizza = nil
end
pizza
end
end
class Pizza
@name
@dough
@sauce
@toppings = []
@veggies = []
@cheese
@pepperoni
@clam
def prepare
end
def bake
puts "350度で25分間焼く"
end
def cut
puts "ピザを扇形に切り分ける"
end
def box
puts "PizzaStore の正式な箱にピザを入れる"
end
def setName( name )
@name = name
end
def getName
@name
end
end
class CheesePizza < Pizza
@ingredientFactory
def initialize( ingredientFactory )
@ingredientFactory = ingredientFactory
end
def prepare
puts "#{@name}を下処理"
@dough = @ingredientFactory.createDough
@sauce = @ingredientFactory.createSauce
@cheese = @ingredientFactory.createCheese
end
end
class ClamPizza < Pizza
@ingredientFactory
def initialize( ingredientFactory )
@ingredientFactory = ingredientFactory
end
def prepare
puts "#{@name}を下処理"
@dough = @ingredientFactory.createDough
@sauce = @ingredientFactory.createSauce
@cheese = @ingredientFactory.createCheese
@clam = @ingredientFactory.createClam
end
end
def main
nyStore = NYPizzaStore.new
chicagoStore = ChicagoPizzaStore.new
pizza = nyStore.orderPizza( "チーズ" )
puts "イーサンの注文は#{pizza.getName}"
pizza = chicagoStore.orderPizza( "チーズ" )
puts "ジョエルの注文は#{pizza.getName}"
end
main
% ./abstractfactory.rb ニューヨークスタイルチーズピザを下処理 350度で25分間焼く ピザを扇形に切り分ける PizzaStore の正式な箱にピザを入れる イーサンの注文はニューヨークスタイルチーズピザ ニューヨークスタイルチーズピザを下処理 350度で25分間焼く ピザを扇形に切り分ける PizzaStore の正式な箱にピザを入れる ジョエルの注文はニューヨークスタイルチーズピザ
[ツッコミを入れる]





