享元模式的定义为:采用一个共享来避免大量拥有相同内容对象的开销。
这种开销中最常见。直观的就是内存的损耗。享元模式以共享的方式高效地支持大量的细粒度对象。
在名字和定义中都体现了共享这个核心概念,那么怎么来实现共享呢?要知道每个事物都是不同的,但同时又有一定的共性,如果只有完全相同的事物才能共享,那么享元模式可以说就是不可行的,因此我们应该尽量将事物的共性共享,而又保留它的个性。
为了做到这点,享元模式中区分了内蕴状态和外蕴状态。内蕴状态就是共性,外蕴状态就是个性。
内蕴对象存储在享元的内部,不会随环境的改变而改变,是可以共享的;
外蕴对象是不可共享的,它随着环境的改变而改变,因此外蕴状态是由客户端来保持(因为环境的变化是由客户端引起的)。在每个具体的环境下,客户端将外蕴状态传递给享元,从而创建出不同的对象来。
/**
*FlyWeight Pattern 享元模式
*/
/**
*抽象享元角色
*/
abstract class Flyweight
{
/**
*示意性方法
*@param string $state 外部状态
*/
abstract public function operation($state);
}
/**
*具体享元角色
*/
class ConcreteFlyweight extends Flyweight
{
private $_intrinsicState = null;
/**
*构造方法
*@param string $state 内部状态
*/
public function __construct($state)
{
$this->intrinscState = $state;
}
public function operation($state)
{
echo 'ConcreteFlyweight operation,Intrinsic State = '.$this->intrinscState . 'Extrinsic State = ' . $state . '<br/>';
}
}
/**
*不共享的具体享元,客户端直接调用
*/
class UnsharedConcreteFlyweight extends Flyweight
{
private $_intrinsicState = null;
/**
*构造方法
*@param string $state 内部状态
*/
public function __construct($state)
{
$this->_intrinsicState = $state;
}
public function operation($state)
{
echo 'UnsharedConcreteFlyweight operation, Intrinsic State = '.$this->_intrinsicState.' Extrinsic State='. $state. '<br/>';
}
}