1、关于享元模式编程
享元模式有点相似于单例模式,都是只生成一个对象被共享使用。享元模式主要目的就是让多个对象实现共享,减小没必要要的内存消耗,将多对同一对象的访问集中起来,没必要为每一个访问者建立一个单独的对象,以此来下降内存的消耗。设计
2、享元模式结构图对象
由于享元模式结构比较复杂,通常结合工厂模式一块儿使用,在它的结构图中包含了一个享元工厂类。blog
在享元模式结构图中包含以下几个角色:接口
Flyweight(抽象享元类):一般是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法能够向外界提供享元对象的内部数据(内部状态),同时也能够经过这些方法来设置外部数据(外部状态)。内存
ConcreteFlyweight(具体享元类):它实现了抽象享元类,其实例称为享元对象;在具体享元类中为内部状态提供了存储空间。一般咱们能够结合单例模式来设计具体享元类,为每个具体享元类提供惟一的享元对象。垃圾回收
UnsharedConcreteFlyweight(非共享具体享元类):并非全部的抽象享元类的子类都须要被共享,不能被共享的子类可设计为非共享具体享元类;当须要一个非共享具体享元类的对象时能够直接经过实例化建立。请求
FlyweightFactory(享元工厂类):享元工厂类用于建立并管理享元对象,它针对抽象享元类编程,将各类类型的具体享元对象存储在一个享元池中,享元池通常设计为一个存储“键值对”的集合(也能够是其余类型的集合),能够结合工厂模式进行设计;当用户请求一个具体享元对象时,享元工厂提供一个存储在享元池中已建立的实例或者建立一个新的实例(若是不存在的话),返回新建立的实例并将其存储在享元池中。程序
3、享元模式的实现方法
在享元模式中引入了享元工厂类,享元工厂类的做用在于提供一个用于存储享元对象的享元池,当用户须要对象时,首先从享元池中获取,若是享元池中不存在,则建立一个新的享元对象返回给用户,并在享元池中保存该新增对象。接下来,实现一个登录的享元模式。
4、总结
从上面代码和运行结果这能够看到,同一个登录者登录时是 "享" 用同一个登录者对象。在享元对象池中只有两个对象。
享元模式优势,在于外部状态相对独立,使得对象能够在不一样的环境中被复用(共享对象能够适应不一样的外部环境)。且享元模式可共享相同或类似的细粒度对象,从而减小了内存消耗,同时下降了对象建立与垃圾回收的开销。
享元模式缺点,外部状态由客户端保存,共享对象读取外部状态的开销可能比较大。享元模式要求将内部状态与外部状态分离,这使得程序的逻辑复杂化,同时也增长了状态维护成本。