<?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(); ?>
时间: 2024-10-05 05:41:28