PHP学习心得


原型模式

<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">&lt;?php //海洋 class Sea{ //可导航性 private $navigability=0; function __construct($navigability){ $this-&gt;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-&gt;sea=$sea; $this-&gt;plains=$plains; $this-&gt;forest=$forest; } function getSea(){ return clone $this-&gt;sea; } function getPlains(){ return clone $this-&gt;plains; } function getForest(){ return clone $this-&gt;forest; } } class Contained{} class Container{ public $contained; function __construct(){ $this-&gt;contained=new Contained(); } function __clone(){ //确保被克隆的对象持有的是self::$contained的克隆而不是引用 $this-&gt;contained=clone $this-&gt;contained; } } $factory=new TerrainFactory(new EarthSea(-1), new EarthPlains(), new EarthForest()); print_r($factory-&gt;getSea()); print "&lt;hr&gt;"; print_r($factory-&gt;getPlains()); print "&lt;hr&gt;"; </code></pre>

页面列表

ITEM_HTML