设计模式第七站--享元模式

         设计模式中主要的思想面向对象,尽管它可以很好的解决程序的扩展性问题,提高复用性和维护性,但面向对象依然会产生很多对象。而程序中对象过多时,会影响程序的运行效率,所以遇到这种情况时我们必须考虑采用设计模式中的“享元模式”。

一、.概述

1.定义

 Flyweight: 运用共享技术有效地支持大量细粒度的对象。(“细粒度”是指将业务模型中的对象进行细分)。

设计模式第七站--享元模式_第1张图片

                                                                     图为 享元模式的结构图

2.角色

       抽象享元角色(Flyweight):此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口或抽象类。那些需要外部状态(External State)的操作可以通过方法的参数传入。抽象享元的接口使得享元变得可能,但是并不强制子类实行共享,因此并非所有的享元对象都是可以共享的。


       具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定的接口。如果有内部状态的话,必须负责为内部状态提供存储空间。享元对象的内部状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。有时候具体享元角色又叫做单纯具体享元角色,因为复合享元角色是由单纯具体享元角色通过复合而成的。


       复合享元(UnsharableFlyweight)角色:复合享元角色所代表的对象是不可以共享的,但是一个复合享元对象可以分解成为多个本身是单纯享元对象的组合。复合享元角色又称做不可共享的享元对象。这个角色一般很少使用。


       享元工厂(FlyweightFactoiy)角色:本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象请求一个享元对象的时候,享元工厂角色需要检查系统中是否已经有一个符合要求的享元对象,如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个新的合适的享元对象。

3.内部状态和外部状态

       在享元对象内部并且不会随着环境改变而改变的共享部分,可以称之为享元对象的内部状态,反之随着环境改变而改变的,不可共享的状态称之为外部状态。

4. 适用性

1)一个应用程序使用大量相同或者相似的对象,造成很大的存储开销

2)对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。

3)如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象

4) 应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值

5)使用享元模式需要维护一个存储享元对象的享元池,而这需要耗费资源,因此,应当在多次重复使用享元对象时才值得使用享元模式(很重要的使用条件)




你可能感兴趣的:(设计模式,对象)