原型模式

54 阅读1分钟

php原型模式
用于创建对象成本过高时

1.原型模式与工厂模式作用类似,都是用来创建对象
2.与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象,这样就免去了类创建时重复的初始化操作
3.原型模式适用于大对象的创建,创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可

<?php
namespace prototype;

/**
 * 原型实体
 */
class Prototype extends PrototypeAbstract
{
  /**
   * 构造函数
   *
   * @param  string $name 属性一
   * @return void
   */
  public function __construct($name='')
  {
    $this->_name = $name;
  }

  /**
   * 魔术方法 设置属性
   *
   * @param string $name  属性名称
   * @param string $value 属性值
   */
  public function __set($name='', $value='')
  {
    $this->$name = $value;
  }

  /**
   * 打印对象名称
   *
   * @return sting
   */
  public function getName()
  {
    echo '我是对象' . $this->_name . " \n\n";
  }

  /**
   * 获取原型对象
   *
   * @return object
   */
  public function getPrototype()
  {
     return clone $this;
  }
}
<?php
namespace prototype;

/**
 * 原型接口
 */
abstract class PrototypeAbstract
{
  /**
   * 名称
   * @var string
   */
  protected $_name;
  
  /**
   * 打印对象名称
   *
   * @return sting
   */
  abstract public function getName();

  /**
   * 获取原型对象
   *
   * @return object
   */
  abstract public function getPrototype();
}
<?php
// 注册自加载
spl_autoload_register('autoload');

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

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

use prototype\Prototype;

// 创建一个原型对象
$prototype = new Prototype();

// 获取一个原型的clone
$prototypeCloneOne = $prototype->getPrototype();
$prototypeCloneOne->_name = 'one';
$prototypeCloneOne->getName();

// 获取一个原型的clone
$prototypeCloneTwo = $prototype->getPrototype();
$prototypeCloneTwo->_name = 'two';
$prototypeCloneTwo->getName();

// 再次获取$prototypeCloneOne的名称
$prototypeCloneOne->getName();