工厂模式

46 阅读1分钟

创建型模式
工厂方法模式和抽象工厂模式的核心区别
工厂方法模式利用继承,抽象工厂模式利用组合
工厂方法模式产生一个对象,抽象工厂模式产生一族对象
工厂方法模式利用子类创造对象,抽象工厂模式利用接口的实现创造对象
工厂方法模式可以退化为简单工厂模式(非23中GOF)

<?php
namespace factory;

/**
 * 动物接口
 */
interface AnimalInterface
{
  
}
<?php
namespace factory;

/**
 * 实体鸡
 *
 */
class Chicken implements AnimalInterface
{
  /**
   * 构造函数
   */
  public function __construct()
  {
    echo "生产了一只鸡~ \n";
  }
}
<?php
namespace factory;

/**
 * 实体猪
 *
 */
class Pig implements AnimalInterface
{
  /**
   * 构造函数
   */
  public function __construct()
  {
    echo "生产了一只猪~ \n";
  }
}
<?php
namespace factory;

interface Factory {
    public function produce();
}
<?php
namespace factory;

/**
 * 农场
 *
 * 生产动物
 */
class Farm implements Factory
{
  /**
   * 构造函数
   */
  public function __construct()
  {
    echo "初始化了一个农场~ \n";
  }

  /**
   * 生产方法
   *
   * 生产动物
   * @param  string $type 动物类型
   * @return mixed       
   */
  public function produce($type='')
  {
    switch ($type) {
      case 'chicken':
        return new Chicken();
        break;

      case 'pig':
        return new Pig();
        break;
      
      default:
        echo "该农场不支持生产该农物~ \n";
        break;
    }
  }
}
<?php
namespace factory;

/**
 * 动物园
 *
 * 生产动物
 */
class Zoo implements Factory
{
    /**
     * 构造函数
     */
    public function __construct()
    {
        echo "初始化了一个动物园~ \n";
    }

    /**
     * 生产方法
     *
     * 生产动物
     * @param  string $type 动物类型
     * @return mixed
     */
    public function produce($type='')
    {
        switch ($type) {
            case 'chicken':
                return new Chicken();
                break;

            case 'pig':
                return new Pig();
                break;

            default:
                echo "该农场不支持生产该农物~ \n";
                break;
        }
    }
}
<?php
namespace factory;

/**
 * 简单动物工厂
 * 无须实现动物工厂接口
 * 生产动物
 */
class SampleFactory
{

    /**
     * 生产方法
     *
     * 生产动物
     * @param  string $type 动物类型
     * @return mixed
     */
    public static function produce($type='')
    {
        switch ($type) {
            case 'chicken':
                return new Chicken();
                break;

            case 'pig':
                return new Pig();
                break;

            default:
                echo "该农场不支持生产该农物~ \n";
                break;
        }
    }
}

 

<?php
// 注册自加载
spl_autoload_register('autoload');

function autoload($class)
{
    require dirname($_SERVER['SCRIPT_FILENAME']) . '//..//' . str_replace('\\', '/', $class) . '.php';
}

/************************************* test *************************************/

use factory\Farm;
use factory\Zoo;
use factory\SampleFactory;

// 初始化一个工厂
$farm = new Farm();

// 生产一只鸡
$farm->produce('chicken');
// 生产一只猪
$farm->produce('pig');

// 初始化一个动物园工厂
$zoo = new Zoo();
$zoo->produce("chicken");
$zoo->produce("pig");

// 工厂方法模式退化为简单工厂模式
SampleFactory::produce("chicken");
SampleFactory::produce("pig");