您的位置:首页 > 编程语言 > PHP开发

初识PHP设计模式--享元模式

2018-01-26 11:55 766 查看
 享元模式(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();


输出结果:
*************新建对象并存入享元池************
战士:保家卫国!冲啊
*************从享元池里取出************
战士:保家卫国!冲啊
*************从享元池里取出************
战士:保家卫国!冲啊
*************新建对象并存入享元池************
骑士:冲散敌军阵形
*************从享元池里取出************
骑士:冲散敌军阵形
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息