设计模式(13)享元模式--结构型

来源:互联网 发布:os x软件推荐 编辑:程序博客网 时间:2024/05/21 05:59

定义

运用共享技术有效地支持大量细颗粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。

角色

抽象享元类(Flyweight)

抽象享元类声明一个接口,通过它可以接受并作用于外部状态。在抽象享元类中定义了具体享元类公共的方法,这些方法可以向外界提供享元的内部数据(内部状态),同时也可以通过这些方法来设置外部数据(外部状态)

具体享元类(ConcreteFlyweight )

具体享元类实现了抽象享元接口,其实例称为享元对象,在具体享元类中为内部状态提供了存储空间,由于具体享元对象必须是可以共享的,因此它所存储的状态必须是内部的,即它独立存在于自己的环境中。可以结合单例模式来实际具体享元类,为每一个具体享元类提供唯一的享元对象。

非共享具体享元(UnSharedConcreteFlyweight )

并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类则设计为非共享具有享元类,当需要一个非共享具体享元类的对象时可以直接通过实例化创建;在某些享元模式的层次结构中,非共享具体享元对象还可以将具体享元对象作为子节点。

享元工厂类(FlyweightFactory )

享元工厂类用于创建并管理享元对象;它针对抽象享元类编程,将各种类型的具体享元对象存储在一个享元池中,享元池一般设计为一个存储键值对的集合,可以结合工厂模式进行设计;当用户请求一个具体享元对象时,享元工厂提供存储在享元池中已创建的实例或者创建一个新的实例,返回该新建实例并将其存储在享元池中。# 类图

示例

要点

享元模式优点
1 它能够极大的减少系统中对象的个数。
2 使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元模式使得享元对象能够在不同的环境被共享。
享元模式缺点
1 享元模式需要区分外部状态和内部状态,使得应用程序在某种程度上来说更加复杂化了。
享元模式适用场景
它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。

原创粉丝点击