티스토리 뷰
<?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 |
PHP COOK Book 책 정리하기 (0) | 2016.10.06 |
SQL 라이트 기본사용하기 ( Command Line Shell For SQLite) (0) | 2016.08.25 |
array_map 활용가이드 (0) | 2016.08.10 |