美文网首页
设计模式(十九):享元模式

设计模式(十九):享元模式

作者: 骑着母猪砍大象 | 来源:发表于2018-12-18 19:49 被阅读18次

转载请注明作者和出处https://www.jianshu.com/p/33098b73772e(https://www.jianshu.com/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();

参考资料

相关文章

网友评论

      本文标题:设计模式(十九):享元模式

      本文链接:https://www.haomeiwen.com/subject/rhfrkqtx.html