原型模式
原创
©著作权归作者所有:来自51CTO博客作者壹小小俊的原创作品,请联系作者获取转载授权,否则将追究法律责任
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();