티스토리 뷰

<?Php

/* // 추상 팩토리 패턴에서는 인터페이스를 이용하여 서로 연관된, 또는 의존하는 개체를 구상 클래스를 지정 하지 않고도 생성할 수 있습니다 // 추상 팩토리 패턴은 본격적으로 인터페이스와 업 캐스팅을 통해서 객체 자동생성을 구현하게 되고, // 그것을 통해 생산성과 직접적인 연관을 가지게 됩니다. 결국 높은 객체 생산 효율을 추구하는 디자인 패턴인 것이죠. // /* 이어지는 피자가게 프랜차이즈 스토리에 대한 설명을 약간 해야 할 것 같습니다. 객체마을 피자가게가 인기가 올라가자 뉴욕과 시카고에 분점을 내기로 한 것까지가 지난번 팩토리메서드의 이야기였습니다. 그런데 일부 분점에서는 자잘한 재료를 더 싼 재료로 바꿔서 원가를 줄이고 마진을 올리고 있다는 정보를 들어왔습니다. 이런 현상이 심해지면 객체마을 피자 브랜드의 품질에 타격이 올 수 있기 때문에 각 분점에서 임의로 재료를 공급해서 조달하는 것을 막고자 하는 것이 이번 추상 팩토리 패턴의 목적 입니다. */ interface IPizzaIngredientFactory { public function createDough(); public function createSauce(); public function createCheese(); public function createVeggies(); public function createPepperoni(); public function createClam(); } class NYPizzaIngredientFactory implements IPizzaIngredientFactory { function createDough() { return "<b> 이마트 도우 </b>"; } function createSauce() { //return new EmartSource(); //return new HimartSoure(); return " <b> 이마트 소스 </b>"; } function createCheese() { return " <b> 이마트 치즈 </b>"; } function createVeggies() { return " <b> 이마트 야채 </b>"; } function createPepperoni() { return " <b> 하이마트 페페로니 </b> "; } function createClam() { return " <b> 재주도산 조개 </b> "; } } class ChicagoPizzaIngredientFactory implements IPizzaIngredientFactory { function createDough() { return "<b> 시카고 도우 </b>"; } function createSauce() { //return new EmartSource(); //return new HimartSoure(); return " <b> 시카고 소스 </b>"; } function createCheese() { return " <b> 시카고 치즈 </b>"; } function createVeggies() { return " <b> 시카고 야채 </b>"; } function createPepperoni() { return " <b> 시카고 페페로니 </b> "; } function createClam() { return " <b> 시카고 조개 </b> "; } } // 생산자 abstract class PizzaStore { public $_pizza; function orderPizza($pizzaStyle) { $pizza = $this->createPizza($pizzaStyle); $pizza->prepare(); $pizza->bake(); $pizza->cut(); $pizza->box(); return $pizza; } abstract function createPizza($pizzaStyle); //팩토리 메소드 } class NYPizzaStore extends PizzaStore { public $_ingredientFactory; function __construct() { $this->_ingredientFactory = new NYPizzaIngredientFactory(); } function createPizza($style) { switch ($style) { case 'cheese': $this->_pizza = new CheesePizza($this->_ingredientFactory); $this->_pizza->setName("뉴욕스타일 치즈피자"); break; case 'pepperoni': $this->_pizza = new PepperoniPizza($this->_ingredientFactory); $this->_pizza->setName("뉴욕스타일 페페로니피자"); break; case 'clam': $this->_pizza = new CalmPizza($this->_ingredientFactory); $this->_pizza->setName("뉴욕스타일 조개피자"); break; case 'veggie': $this->_pizza = new VeggiePizza($this->_ingredientFactory); $this->_pizza->setName("뉴욕스타일 야체피자"); break; } return $this->_pizza; } } class ChicagoPizzStore extends PizzaStore { function __construct() { $this->_ingredientFactory = new ChicagoPizzaIngredientFactory(); } function createPizza($style) { switch ($style) { case 'cheese': $this->_pizza = new CheesePizza($this->_ingredientFactory); $this->_pizza->setName("시카고 치즈피자"); break; case 'pepperoni': $this->_pizza = new PepperoniPizza($this->_ingredientFactory); $this->_pizza->setName("시카고 페페로니피자"); break; case 'clam': $this->_pizza = new CalmPizza($this->_ingredientFactory); $this->_pizza->setName("시카고 조개피자"); break; case 'veggie': $this->_pizza = new VeggiePizza($this->_ingredientFactory); $this->_pizza->setName("시카고 야체피자"); break; } return $this->_pizza; } } //제품 abstract class Pizza { public $_name; public $_dough; public $_sauce; public $_veggies = array(); public $_cheese; public $_pepperoni; public $_clam; public function getName() { return $this->_name; } public function setName($name) { $this->_name = $name; } function bake() { echo "<br/>피자를 굽습니다. : " . $this->getName(); } function cut() { echo "<br/>피자를 자릅니다. : " . $this->getName(); } function box() { echo "<br/>피자를 포장합니다. : " . $this->getName(); } public function __toString() { $dispaly = ""; $dispaly .= "<br/>----------" . $this->getName() . "를 준비합니다. ---------"; if ($this->_dough) { $dispaly .= "<br/>도우 반주중 .. : " . $this->_dough; } if ($this->_sauce) { $dispaly .= "<br/>소스 추가중 .. : " . $this->_sauce; } if ($this->_cheese) { $dispaly .= "<br/>치즈 반주중 .. : " . $this->_cheese; } if ($this->_pepperoni) { $dispaly .= "<br/>페페로니추가중 .. : " . $this->_pepperoni; } if ($this->_clam) { $dispaly .= "<br/>조개 추가중 .. : " . $this->_clam; } return $dispaly; } abstract function prepare(); } class CheesePizza extends Pizza { public $_ingredientFactory; public function __construct($ingredientFactory) { $this->_ingredientFactory = $ingredientFactory; } public function prepare() { echo "<br/>피자 주문 접수 . : " . $this->getName(); $this->_dough = $this->_ingredientFactory->createDough(); $this->_sauce = $this->_ingredientFactory->createSauce(); $this->_cheese = $this->_ingredientFactory->createCheese(); $this->_clam = $this->_ingredientFactory->createClam(); echo $this->__toString(); } } class CalmPizza extends Pizza { public $_ingredientFactory; public function __construct($ingredientFactory) { $this->_ingredientFactory = $ingredientFactory; } public function prepare() { echo "<br/>피자 주문 접수 . : " . $this->getName(); $this->_dough = $this->_ingredientFactory->createDough(); $this->_sauce = $this->_ingredientFactory->createSauce(); $this->_cheese = $this->_ingredientFactory->createCheese(); $this->_clam = $this->_ingredientFactory->createClam(); echo $this->__toString(); } } $nyStore = new NYPizzaStore(); $pizza = $nyStore->orderpizza("cheese"); echo "<br/>주문한 피자가 나왔습니다 : " . $pizza->getName(); echo "<br/><br/>"; $chicagoStore = new ChicagoPizzStore(); $pizza = $chicagoStore->orderPizza("clam"); echo "<br/>주문한 피자가 나왔습니다 : " . $pizza->getName();


저작자 표시
신고

'웹개발 > Php' 카테고리의 다른 글

옵저버패턴샘플  (0) 2017.02.06
Apater 패턴 샘플  (0) 2017.02.06
추상팩토리 패턴 샘플 소스  (0) 2017.02.06
PHP COOK Book 책 정리하기  (0) 2016.10.06
SQL 라이트 기본사용하기 ( Command Line Shell For SQLite)  (0) 2016.08.25
array_map 활용가이드  (0) 2016.08.10
댓글
댓글쓰기 폼