<?php
/**
* 原型模式
*
* 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
*
*
*/
//抽象原型(Prototype)角色:声明一个克隆自身的接口
abstract class Prototype
{
private $_id=null;
public function __construct($id)
{
$this->_id =$id;
}
public function getID()
{
return $this->_id;
}
public function __clone() // magic function
{
$this->_id +=1;
}
public function getClone()
{
return clone $this;
}
}
//具体原型(Concrete Prototype)角色:实现一个克隆自身的操作
class ConcretePrototype extends Prototype
{
}
$objPrototype=new ConcretePrototype(0);
$objPrototype1=clone $objPrototype;
echo $objPrototype1->getID()."<br/>";//1
$objPrototype2=$objPrototype;
echo $objPrototype2->getID()."<br/>";//0
$objPrototype3=$objPrototype->getClone();
echo $objPrototype3->getID()."<br/>";//1
性能优良:原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模式可以更好的体现其优点。
原型模式主要用于当需要创建很多相同的类实例时,通过复制原型来快速创建。PHP中即使用clone关键词。比如我们有一个网页游戏,游戏界面有一个网格组成,每个格子可以分别用sea,forest和plains填充,这时我们需要使用 TerrainFactory来管理这个网格,由于sea,forest和plains都是差不多的,而且需要很多,就可以使用原型模式。当然每个类型的 创建还是使用抽象工厂模式。
class TerrainFactory {
private $sea;
private $forest;
private $plains;
function __construct( Sea $sea, Plains $plains, Forest $forest ) {
$this->sea = $sea;
$this->plains = $plains;
$this->forest = $forest;
}
function getSea( ) {
return clone $this->sea;
}
function getPlains( ) {
return clone $this->plains;
}
function getForest( ) {
return clone $this->forest;
}
}