书城计算机网络大话设计模式
8183300000091

第91章 6 享元模式特征

大B:“你知道享元模式有哪些特征吗?”

小A:“享元模式包括有单纯享元模式和复合享元模式。他们都有不同的角色不同的特征。”

大B:下面我来具体说说。

首先单纯享元模式,它有抽象享元角色、具体享元角色、享元工厂角、客户端角色。

抽象享元角色:所有的具体享元类的超类,规定出需要实现的公共接口。那些需要外蕴状态的操作可以通过方法的参数传入。

具体享元角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。

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

客户端角色:需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态。

还有就是复合享元模式,它有抽象享元角色、具体享元角色、复合享元角色、享元工厂角、客户端角色。

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

具体享元角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。

复合享元角色是由具体享元角色通过复合而成。复合享元角色:复合享元角色所代表的对象是不可以共享的,但是可以分解成多个可以共享的具体享元角色。

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

客户端角色:需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态。

大B:“你说一下享元模式适用于哪些地方?”

小A:“好的。Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用它。当以下情况都成立时使用Flyweight模式。1、一个应用程序使用了大量的对象。2、完全由于使用大量的对象,造成很大的存储开销。3、对象的大多数状态都可变为外部状态。4、如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。5、应用程序不依赖对象标识。”