🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#### 享元模式 * [**享元模式**](https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/flyweight.html) **享元模式**(英语:Flyweight Pattern)是一种软件[设计模式](https://zh.wikipedia.org/wiki/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F_(%E8%AE%A1%E7%AE%97%E6%9C%BA))。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。 要理解享元模式,先要理解两个重要的概念:内部状态和外部状态。 内部状态存储于flyweight中,它包含了独立于flyweight场景的信息,这些信息使得flyweight可以被共享。而外部状态取决于flyweight场景,并根据场景而变化,因此不可共享。用户对象负责在必要的时候将外部状态传递给flyweight。 `角色` Flyweight: 抽象享元类 ConcreteFlyweight: 具体享元类 UnsharedConcreteFlyweight: 非共享具体享元类 FlyweightFactory: 享元工厂类 `UML类图` ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid108299labid2297timestamp1486374834526.png) `示例代码`:`FlyWeight.class.php` ~~~php <?php interface Flyweight{ public function operation(); } class MyFlyweight implements Flyweight { protected $intrinsicState; function __construct($str) { $this->intrinsicState = $str; } public function operation() { echo 'MyFlyweight['.$this->intrinsicState.'] do operation. <br>'; } } class FlyweightFactory { protected static $flyweightPool; function __construct() { if (!isset(self::$flyweightPool)) { self::$flyweightPool = []; } } public function getFlyweight($str) { if (!array_key_exists($str,self::$flyweightPool)) { $fw = new MyFlyweight($str); self::$flyweightPool[$str] = $fw; return $fw; } else { echo "aready in the pool,use the exist one: <br>"; return self::$flyweightPool[$str]; } } } $factory = new FlyweightFactory(); $fw = $factory->getFlyweight('one'); $fw->operation(); $fw1 = $factory->getFlyweight('two'); $fw1->operation(); $fw2 = $factory->getFlyweight('one'); $fw2->operation(); ~~~ 享元模式的核心在于享元工厂类,享元工厂类的作用在于提供一个用于存储享元对象的享元池,用户需要对象时,首先从享元池中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。