码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之结构型模式—— 2.6 享元模式

时间:2015-02-17 23:43:02      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:设计模式   享元模式

<?php

/**
 * 2.6 享元模式
 *   定义:
 *       运用共享技术有效地支持大量细粒度的对象。
 *   角色:
 *       1. 抽象享元(Flyweight)类
 *           职责:所有具体享元类的超类或接口,
 *                 通过这个接口,享元类可以接
 *                 受并作用于外部状态。
 *       2. 具体享元类
 *           职责:继承享元抽象类,并为内部状态
 *                 增加存储空间。
 *       3. 非共享Unshared具体享元类
 *           职责:不需要共享的享元子类,因为抽
 *                 象享元类使共享成为可能,但它
 *                 并不强制共享。
 *       4. 享元工厂类
 *           职责:用来创建并管理享元对象。确保
 *                 合理的共享Flyweight,当用户请
 *                 求一个Flyweight时,享元工厂对
 *                 象提供一个以创建的实例或者创
 *                 建一个(如果不存在的话).
 *          
 *                 
 *           
 *   优点:
 *       1. 享元模式的优点在于它能够极大的减少系
 *          统中对象的个数。
 *       2. 享元模式由于使用了外部状态,外部状态
 *          相对独立,不会影响到内部状态,所以享
 *          元模式使得享元对象能够在不同的环境被
 *          共享。
 *   缺点:   
 *       1. 由于享元模式需要区分外部状态和内部状
 *          态,使得应用程序在某种程度上来说更加
 *          复杂化了。 
 *       2. 为了使对象可以共享,享元模式需要将享
 *          元对象的状态外部化,而读取外部状态使
 *          得运行时间变长。
 * 
 *   使用场景:
 *       1. 一个应用程序使用了大量的对象。
 *       2. 完全由于使用大量的对象,造成很大的存
 *          储开销。
 *       3. 对象的大多数状态都可变为外部状态。
 *       4. 如果删除对象的外部状态,那么可以用相
 *          对较少的共享对象取代很多组对象。
 *       5. 应用程序不依赖于对象标识。由于Flyweight
 *          对象可以被共享,对于概念上明显有别的对象
 *          ,标识测试将返回真值。
 *          
 */


//用户类
class User{
    private $name;
    public function __construct($name){
        $this->name=$name;
    }
    public function getName(){
        return $this->name;
    }
}

//网站抽象类
abstract class WebSite{
    abstract public function usage(User $user);
}

//具体网站类
class ConcreteWebSite extends WebSite{
    public $name;
    public function __construct($name){
        $this->name=$name;
    }

    public function usage(User $user){
        echo ‘网站分类:‘.$this->name.‘  用户:‘.$user->getName();
    }
}

//网站工厂类
class WebSiteFactory{
    private $flyweight=array();
    //获得网站分类
    public function getWebSiteCategory($key){
        if(!array_key_exists($key, $this->flyweight)){
            $this->flyweight[$key]=new ConcreteWebSite($key);
        }
        return $this->flyweight[$key];
    }

    //获得网站分类总数
    public function getWebSiteCount(){
        return count($this->flyweight);
    }
}


//客户端
$wsf=new WebSiteFactory();
$factoryShow1=$wsf->getWebSiteCategory(‘产品展示‘);
$factoryShow1->usage(new User(‘张三‘));
echo ‘<br/>‘;
//$factoryShow2和$factoryShow1使用的是同一个对象
//它们是对堆内存中的数据的两个引用而已。
$factoryShow2=$wsf->getWebSiteCategory(‘产品展示‘);
$factoryShow2->usage(new User(‘李四‘));
echo ‘<br/>‘;
echo $wsf->getWebSiteCount();


echo ‘<br/>‘;
$blog=$wsf->getWebSiteCategory(‘博客‘);
$blog->usage(new User(‘王五‘));
echo ‘<br/>‘;
echo $wsf->getWebSiteCount();

?>


本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614781

设计模式之结构型模式—— 2.6 享元模式

标签:设计模式   享元模式

原文地址:http://noican.blog.51cto.com/4081966/1614781

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!