PHP 工厂方法模式

简单工厂其实不是一个设计模式,反而比较像是一种编程习惯。

有些开发人员的确是把这个编程习惯误认为是工厂模式。

<?php
//比萨商店
class PizzaStore{
  public $Factory;

  public function __construct($factory){
    $this->Factory = $factory;
  }

  public function orderPizza($type){
    $Pizza = $this->Factory->createPizza($type);

    $Pizza->prepare();
    $Pizza->bake();
    $Pizza->cut();
    $Pizza->box();

    return $Pizza;
  } 
}

//简单比萨工厂
class SimplePizzaFactory{
  public function createPizza($type){
    $Pizza = null;

    if ('cheese' == $type) {
      $Pizza = new CheesePizza();
    }elseif ('pepperoni' == $type){
      $Pizza = new PepperoniPizza();
    }

    return $Pizza;
  } 
}

工厂方法模式 Factory Method Pattern,定义了一个创建对象的接口,但由子类决定要实例化的是哪一个。

工厂方法让类把实例化推迟到子类。

//比萨接口
interface Pizza{
  public function prepare();
  public function bake();
  public function cut();
  public function box();
}

//比萨1
class CheesePizza implements Pizza{
  public function prepare(){
    echo 'CheesePizza prepare<br />';
  }

  public function bake(){
    echo 'CheesePizza bake<br />';
  }

  public function cut(){
    echo 'CheesePizza cut<br />';
  }

  public function box(){
    echo 'CheesePizza box<br />';
  }
}

//比萨2
class PepperoniPizza implements Pizza{
  public function prepare(){
    echo 'PepperoniPizza prepare<br />';
  }

  public function bake(){
    echo 'PepperoniPizza bake<br />';
  }

  public function cut(){
    echo 'PepperoniPizza cut<br />';
  }

  public function box(){
    echo 'PepperoniPizza box<br />';
  }
}

//纽约比萨1
class NYCheesePizza implements Pizza{
  public function prepare(){
    echo 'NYCheesePizza prepare<br />';
  }

  public function bake(){
    echo 'NYCheesePizza bake<br />';
  }

  public function cut(){
    echo 'NYCheesePizza cut<br />';
  }

  public function box(){
    echo 'NYCheesePizza box<br />';
  }
}

//纽约比萨2
class NYPepperoniPizza implements Pizza{
  public function prepare(){
    echo 'NYPepperoniPizza prepare<br />';
  }

  public function bake(){
    echo 'NYPepperoniPizza bake<br />';
  }

  public function cut(){
    echo 'NYPepperoniPizza cut<br />';
  }

  public function box(){
    echo 'NYPepperoniPizza box<br />';
  }
}

//芝加哥比萨1
class ChicagoCheesePizza implements Pizza{
  public function prepare(){
    echo 'ChicagoCheesePizza prepare<br />';
  }

  public function bake(){
    echo 'ChicagoCheesePizza bake<br />';
  }

  public function cut(){
    echo 'ChicagoCheesePizza cut<br />';
  }

  public function box(){
    echo 'ChicagoCheesePizza box<br />';
  }
}

//芝加哥比萨2
class ChicagoPepperoniPizza implements Pizza{
  public function prepare(){
    echo 'ChicagoPepperoniPizza prepare<br />';
  }

  public function bake(){
    echo 'ChicagoPepperoniPizza bake<br />';
  }

  public function cut(){
    echo 'ChicagoPepperoniPizza cut<br />';
  }

  public function box(){
    echo 'ChicagoPepperoniPizza box<br />';
  }
}

//定义比萨商店
abstract class PizzaStore{

  public function orderPizza($type){
    $Pizza = $this->createPizza($type);

    $Pizza->prepare();
    $Pizza->bake();
    $Pizza->cut();
    $Pizza->box();

    return $Pizza;
  }

  abstract protected function createPizza($type);
}

//纽约比萨店
class NYPizzaStore extends PizzaStore{
  public function createPizza($type){
    $Pizza = null;

    if ('cheese' == $type) {
      $Pizza = new NYCheesePizza();
    }elseif ('pepperoni' == $type){
      $Pizza = new NYPepperoniPizza();
    }

    return $Pizza;
  }
}

//芝加哥比萨店
class ChicagoPizzaStore extends PizzaStore{
  public function createPizza($type){
    $Pizza = null;

    if ('cheese' == $type) {
      $Pizza = new ChicagoCheesePizza();
    }elseif ('pepperoni' == $type){
      $Pizza = new ChicagoPepperoniPizza();
    }

    return $Pizza;
  }
}

$NYPizzaStore = new NYPizzaStore();
$ChicagoPizzaStore = new ChicagoPizzaStore();

$NYPizzaStore->orderPizza('cheese');
$ChicagoPizzaStore->orderPizza('pepperoni');

输出

NYCheesePizza prepare  
NYCheesePizza bake  
NYCheesePizza cut  
NYCheesePizza box  
ChicagoPepperoniPizza prepare   
ChicagoPepperoniPizza bake   
ChicagoPepperoniPizza cut  
ChicagoPepperoniPizza box  

上一篇
PHP 冒泡排序 PHP 冒泡排序
使用递归实现冒泡排序 PHP 多递归时需要 return,如下述代码中 return bubblesort($array, $count-1); 如果改为 bubblesort($array, $count-1); 上层就接不到值,即结
2012-09-22
下一篇
PHP 装饰者模式 PHP 装饰者模式
装饰者模式 Decorator Pattern ,动态地将责任附加到对象上。 若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 <?php //饮料抽象类 abstract class Beverage{ public $de
2012-08-18