原型模式
<ul>
<li>与工厂模式类似,都是用来创建对象的。利用克隆来生成一个大对象,减少创建时的初始化等操作占用开销</li>
<li>原型模式就是clone就是内存拷贝,比new的好处是创建对象快速,适合大对象创建</li>
<li>原型模式与工厂模式作用类似,都是用来创建对象</li>
<li>与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象,这样就免去了类创建时重复的初始化操作</li>
<li>原型模式适用于大对象的创建,创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可</li>
</ul>
<h3>为什么需要原型模式</h3>
<ul>
<li>有些时候,我们需要创建多个类似的大对象。如果直接通过new对象,开销很大,而且new完还得进行重复的初始化工作。
<ul>
<li>可能把初始化工作封装起来的,但是对于系统来说,你封不封装,初始化工作还是要执行。,</li>
</ul></li>
<li>原型模式则不同,原型模式是先创建好一个原型对象,然后通过clone这个原型对象来创建新的对象,这样就免去了重复的初始化工作,系统仅需内存拷贝即可。</li>
</ul>
<h3>简单实例</h3>
<ul>
<li>现在正开发一个游戏,有不同的地图,地图大小都是一样的,并且都有海洋,但是不同的地图温度不一样</li>
</ul>
<h2>代码示例</h2>
<pre><code class="language-PHP"><?php
//海洋
class Sea{
//可导航性
private $navigability=0;
function __construct($navigability){
$this->navigability=$navigability;
}
}
//地球海洋
class EarthSea extends Sea{}
//火星海洋
class MarsSea extends Sea{}
//平原
class Plains{}
//地球平原
class EarthPlains extends Plains{}
//火星平原
class MarsPlains extends Plains{}
//森岭
class Forest{}
//地球森林
class EarthForest extends Forest{}
//火星森林
class MarsForest extends Forest{}
//地形工厂
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;
}
}
class Contained{}
class Container{
public $contained;
function __construct(){
$this->contained=new Contained();
}
function __clone(){
//确保被克隆的对象持有的是self::$contained的克隆而不是引用
$this->contained=clone $this->contained;
}
}
$factory=new TerrainFactory(new EarthSea(-1), new EarthPlains(), new EarthForest());
print_r($factory->getSea());
print "<hr>";
print_r($factory->getPlains());
print "<hr>";
</code></pre>