享元模式(Flyweight)
属于结构型模式之一,定义:运用共享技术有效地支持大量细粒度对象的复用。
看定义理解起来也不算难,就是将系统中需要重复创建的对象,共享在一个享元池里面,
当第二次创建的时候,直接调用享元池里面已经存好的对象就可以了。
主要用于大量需要重复创建的对象。
整体代码的结构有点像是简单工厂扩展演变而来的,在简单工厂的基础上,把重复创建的对象共享在享元池。
输出结果:
看定义理解起来也不算难,就是将系统中需要重复创建的对象,共享在一个享元池里面,
当第二次创建的时候,直接调用享元池里面已经存好的对象就可以了。
主要用于大量需要重复创建的对象。
整体代码的结构有点像是简单工厂扩展演变而来的,在简单工厂的基础上,把重复创建的对象共享在享元池。
场景:
我们在玩一些战争类游戏的时候,我们经常会在兵工厂里面重复去购买各种兵种的士兵,每个士兵都是对象的话,我们就会需要重复创建很多对象,享元模式很好的帮我们解决了这个问题。
代码如下:
<?php
/** 抽象兵工厂类
* abstract Arsenal
*/
abstract Class Arsenal{
abstract function Create();
}
/** 具体战士类
* Warrior
*/
Class Warrior extends Arsenal
{
function Create()
{
echo "战士:保家卫国!冲啊<br/>";
}
}
/** 具体骑士类
* Knight
*/
Class Knight extends Arsenal
{
function Create()
{
echo "骑士:冲散敌军阵形<br/>";
}
}
/** 享元类
* Flyweight
*/
Class Flyweight{
// 定义享元池
private $flyweights = array();
function getObjClass($name){
if(isset($this->flyweights[$name]))
{
echo "*************从享元池里取出************<br/>";
return $this->flyweights[$name];
}
else{
echo "*************新建对象并存入享元池************<br/>";
$ClassName = new $name();
$this->flyweights[$name] = $ClassName;
return $this->flyweights[$name];
}
}
}
<?php
header("Content-Type:text/html;charset=utf-8");
require_once "Flyweight.php";
$obj = new Flyweight();
// 第1个战士
$War1 = $obj->getObjClass("Warrior");
$War1->Create();
// 第2个战士
$War2 = $obj->getObjClass("Warrior");
$War2->Create();
// 第3个战士
$War3 = $obj->getObjClass("Warrior");
$War3->Create();
// 第1个骑兵
$kni1 = $obj->getObjClass("Knight");
$kni1->Create();
// 第2个骑兵
$kni2 = $obj->getObjClass("Knight");
$kni2->Create();
输出结果:
*************新建对象并存入享元池************
战士:保家卫国!冲啊
*************从享元池里取出************
战士:保家卫国!冲啊
*************从享元池里取出************
战士:保家卫国!冲啊
*************新建对象并存入享元池************
骑士:冲散敌军阵形
*************从享元池里取出************
骑士:冲散敌军阵形