标签:设计模式 享元模式
<?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
标签:设计模式 享元模式
原文地址:http://noican.blog.51cto.com/4081966/1614781