若转载教程,请注明出自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.将许多“虚拟”对象的状态集中管理
缺点
一旦被实现,单个的逻辑实现将无法拥有独立而不同的行为
使用场景
就是缓存了创建型模式创建的对象,不知道为什么会归在结构型模式中,个人觉得创建型模式更合适,哈哈~
其次,享元强调的缓存对象,外观模式强调的对外保持简单易用,是不是就大体构成了目前牛逼哄哄且满大街的【依赖注入容器】
当一个类有许多的实例,而这些实例能被同一方法控制的时候,我们就可以使用享元模式。