转载请注明作者和出处://www.greatytc.com/p/33098b73772e(/p/33098b73772e)
运行平台: Windows
php版本: php7.0
作者简介: 一个本该成为游戏职业选手却被编程耽误的程序员
享元模式,就是把对象放到某个地方存放着,想要的时候直接拿出来就行,存货的意思
例如我们在玩游戏,要经常弄出来很多士兵,我们不可能针对每个士兵去创造新的对象,这时候我们只需要从享元池拿出来就行,经常配合工厂模式一起使用;
角色
- 享元工厂角色(FWFactory):创建并管理BlogModel对象。
- 所有具体享元父接口角色(BolgModel):接受并作用与外部状态。
- 具体享元角色(JobsBlog):具体变化点,为内部对象增加储存空间。
<?php
//抽象兵工厂类
abstract Class Arsenal{
abstract function Create();
}
//具体战士类
Class Warrior extends Arsenal
{
function Create()
{
echo "战士:保家卫国!冲啊<br/>";
}
}
// 具体骑士类
Class Knight extends Arsenal
{
function Create()
{
echo "骑士:冲散敌军阵形<br/>";
}
}
// 享元类
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];
}
}
}
$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();
参考资料
- [1] PHP设计模式--享元模式(https://blog.csdn.net/xhanguomzhu/article/details/79986325)》