php享元(轻量级)模式

45 阅读1分钟

结构型模式

php享元(轻量级)模式
就是缓存了创建型模式创建的对象,不知道为什么会归在结构型模式中,个人觉得创建型模式更合适,哈哈~
其次,享元强调的缓存对象,外观模式强调的对外保持简单易用,是不是就大体构成了目前牛逼哄哄且满大
的街【依赖注入容器】

下面我们借助最简单的’工厂模式‘来实现享元模式,就是给工厂加了个缓存池

<?php
namespace flyweight;

/**
 * 动物接口
 */
interface AnimalInterface
{
  /**
   * 类型获取
   *
   * @return string
   */
  public function getType();
}
<?php
namespace flyweight;

/**
 * 实体鸡
 *
 */
class Chicken implements AnimalInterface
{
  /**
   * 类别
   * @var string
   */
  private $_type = '';

  /**
   * 构造函数
   */
  public function __construct()
  {

  }

  /**
   * 类型获取
   *
   * @return string
   */
  public function getType()
  {
    echo "这是只鸡~ \n";
  }
}
<?php
namespace flyweight;

/**
 * 实体鸡
 *
 */
class Pig implements AnimalInterface
{
  /**
   * 类别
   * @var string
   */
  private $_type = '';

  /**
   * 构造函数
   */
  public function __construct()
  {

  }

  /**
   * 类型获取
   * 
   * @return string
   */
  public function getType()
  {
    echo "这是只猪~ \n";
  }
}
<?php
namespace flyweight;

/**
 * 农场
 *
 * 生产动物
 */
class Farm
{
  /**
   * 对象缓存池
   * @var array
   */
  private $_farmMap = [];

  /**
   * 构造函数
   */
  public function __construct()
  {
    echo "-----------初始化了一个农场----------- \n\n";
  }

  /**
   * 生产方法
   *
   * 生产农物
   *
   * @param  string $type 农场类型
   * @return mixed
   */
  public function produce($type='')
  {
    // 对象缓存池判断
    if (key_exists($type, $this->_farmMap)) {
      echo "来自缓存池-> ";
      return $this->_farmMap[$type];// 返回缓存
    }

    switch ($type) {
      case 'chicken':
        return $this->_farmMap[$type] =  new Chicken();
        break;

      case 'pig':
        return $this->_farmMap[$type] =  new Pig();
        break;

      default:
        echo "该农场不支持生产该农物~ \n";
        break;
    }
  }
}
<?php
/**
 * 结构型模式
 *
 * php享元(轻量级)模式
 * 就是缓存了创建型模式创建的对象,不知道为什么会归在结构型模式中,个人觉得创建型模式更合适,哈哈~
 * 其次,享元强调的缓存对象,外观模式强调的对外保持简单易用,是不是就大体构成了目前牛逼哄哄且满大
 * 的街【依赖注入容器】
 *
 * 下面我们借助最简单的’工厂模式‘来实现享元模式,就是给工厂加了个缓存池
 *
 *   
 * @example 运行 php test.php
 */


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

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

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

use flyweight\Farm;

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

// 成产一只鸡
$farm->produce('chicken')->getType();
// 再生产一只鸡
$farm->produce('chicken')->getType();