若转载教程,请注明出自SW-X框架官方文档!
<?php/*** 设计模式之享元模式* 场景:缓存调用 - 当需要重复调用一个工厂生产模型时,我们往往可以把这个模型实例缓存起来,以便多次重复调用,减少内存消耗。* 小黄牛*/header("Content-type: text/html; charset=utf-8");# 动物接口interface AnimalInterface{public function getType();}/*** 创建 - 鸡模型*/class ChiCken implements AnimalInterface{public function getType(){echo "这是一只鸡~<br/>";}}/*** 创建 - 猪模型*/class Pig implements AnimalInterface{public function getType(){echo "这是一只猪~<br/>";}}# 农场缓存池class Farm{private $_farmMap = array(); // 对象缓存池public function Produce($type){# 对象缓存池判断if (key_exists($type, $this->_farmMap)) {echo "来自缓存池-> ";return $this->_farmMap[$type]; // 返回缓存}# 建立缓存switch ($type) {case 'chicken':return $this->_farmMap[$type] = new Chicken();break;case 'pig':return $this->_farmMap[$type] = new Pig();break;}}}# 初始化一个缓存池$farm = new Farm();# 成产一只鸡$farm->Produce('chicken')->getType();# 再生产一只鸡$farm->Produce('chicken')->getType();# 再生产一只鸡$farm->Produce('chicken')->getType();# 生产一只猪$farm->Produce('pig')->getType();# 再生产一只猪$farm->Produce('pig')->getType();# 再生产一只猪$farm->Produce('pig')->getType();
浏览器输出
这是一只鸡~来自缓存池-> 这是一只鸡~来自缓存池-> 这是一只鸡~这是一只猪~来自缓存池-> 这是一只猪~来自缓存池-> 这是一只猪~
享元模式
享元工厂角色(FWFactory):创建并管理BlogModel对象。所有具体享元父接口角色(BolgModel):接受并作用与外部状态。具体享元角色(JobsBlog):具体变化点,为内部对象增加储存空间。
优点
1.减少运行时对象实例的个数,节省内存2.将许多“虚拟”对象的状态集中管理
缺点
一旦被实现,单个的逻辑实现将无法拥有独立而不同的行为
使用场景
就是缓存了创建型模式创建的对象,不知道为什么会归在结构型模式中,个人觉得创建型模式更合适,哈哈~其次,享元强调的缓存对象,外观模式强调的对外保持简单易用,是不是就大体构成了目前牛逼哄哄且满大街的【依赖注入容器】当一个类有许多的实例,而这些实例能被同一方法控制的时候,我们就可以使用享元模式。
