1. 享元模式概述
当一个系统中运行时产生的对象数量太多, 将致使运行代价太高, 带来系统性能降低的问题.编程
享元模式: 运用共享技术有效的支持大量细粒度对象的复用. 系统只使用少许的对象, 而这些对下行都很类似, 状态变化很小, 能够实现对象的屡次复用. 因为享元模式要求可以共享对象必须是细粒度的对象, 所以又称为轻量级模式, 它是一种对象结构型模式.设计模式

在享元模式结构图中包含以下几个角色:性能
- Flyweight(抽象享元类):一般是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法能够向外界提供享元对象的内部数据(内部状态),同时也能够经过这些方法来设置外部数据(外部状态)。
- ConcreteFlyweight(具体享元类):它实现了抽象享元类,其实例称为享元对象;在具体享元类中为内部状态提供了存储空间。一般咱们能够结合单例模式来设计具体享元类,为每个具体享元类提供惟一的享元对象。
- UnsharedConcreteFlyweight(非共享具体享元类):并非全部的抽象享元类的子类都须要被共享,不能被共享的子类可设计为非共享具体享元类;当须要一个非共享具体享元类的对象时能够直接经过实例化建立。
- FlyweightFactory(享元工厂类):享元工厂类用于建立并管理享元对象,它针对抽象享元类编程,将各类类型的具体享元对象存储在一个享元池中,享元池通常设计为一个存储“键值对”的集合(也能够是其余类型的集合),能够结合工厂模式进行设计;当用户请求一个具体享元对象时,享元工厂提供一个存储在享元池中已建立的实例或者建立一个新的实例(若是不存在的话),返回新建立的实例并将其存储在享元池中。
在享元模式中引入了享元工厂类,享元工厂类的做用在于提供一个用于存储享元对象的享元池,当用户须要对象时,首先从享元池中获取,若是享元池中不存在,则建立一个新的享元对象返回给用户,并在享元池中保存该新增对象。.net
2. 享元模式的Swift实现
这个设计模式在OC中的应用, 例如UITableViewCell的复用就是, 例如UICollectionViewCell的复用就是. 用的地方不太多, 可是用处仍是比较大的, 若是不适用这样的方法减小对象的建立, 在滑动tableview时候确定会致使内存的暴增!设计
3. 单纯享元模式和符合享元模式
3.1 单纯享元模式
在单纯享元模式中, 全部的具体享元类都是共享的, 不存在非共享的享元类.对象
3.2 复合享元模式
将一些单纯享元对象使用组合模式加一组合, 能够造成复合享元对象, 这样的对象自己不能共享, 可是他们可以分解成单纯享元对象, 然后者能够共享. 复合膜是结构图以下所示:blog

经过复合享元模式, 能够确保享元类中包含的每一个单纯享元类都有相同的外部状态, 而这些单纯享元内部状态每每能够不一样. 若是但愿多个内部状态不一样的享元对象设置相同的外部状态, 能够考虑使用复合享元模式.接口
4. 享元模式总结
当系统中存在大量相同或者类似的对象时候, 享元模式是一种较好的解决方案, 它经过共享技术实现相同或者类似的细粒度对象的复用, 从而节约了内存空间, 提升了系统性能. 相比其它结构型设计模式, 享元模式的使用频率并非很高, 可是做为一种以"节约内存, 提升性能"为出发点的设计模式, 它在软件开发中, 仍是获得了必定程度上的应用.内存
4.1 主要优势
- 能够极少的减小内存对象的数量, 使得相同或者类似的对象再内存中只保存一份, 从而能够节约系统资源, 提升系统性能.
- 享元模式的外部状态相对独立, 并且不会影响其内部状态, 从而使得享元对象能够在不一样的环境中被共享.
4.2 主要缺点
- 享元模式使得系统变得复杂, 须要分离内部状态和外部状态, 使得系统的逻辑复杂化.
- 为了使对象能够共享, 享元模式须要将享元对象的部分状态外部化, 而读取外部状态将使得运行时间变长.
4.3 使用场景
- 一个系统中有大量相同或者类似的对象, 形成内存的大量耗费.
- 对象的大部分状态均可之外部化, 能够将这些状态传入对象中.
- 在使用享元模式时候须要维护一个存储享元对象的享元池, 而这须要耗费必定的系统资源, 所以应当在须要重复使用享元对象时才值得使用享元模式.
Reference: http://blog.csdn.net/lovelion/article/details/7667781资源