天天看点

Aha!设计模式(64)-享元模式(1)

意图

通过共享的方式避免在不同对象之间重复构建相同的数据或对象。

动机

面向对象设计技术的应用使程序员在处理复杂系统时,可以将系统中的个体看作一个一个独立的对象,从而大大降低了处理的复杂性。但是这种处理有时候也会带来一些问题。

例如,最近经常可以看到使用大量的无人机在空中摆造型的例子,几千个无人机在空中摆出各种图案,场景那叫一个壮观。我们今天就以无人机的通讯为例说明享元模式。首先提两个假设:

1.无人机数量非常巨大,以至于需要多个品牌的无人机合作演出。

2.不同厂家生产的无人机可以接受的命令的种类,形式,通讯方式都会有所不同。

为了能够以同样的方式控制这些无人机,我们可以设计一个通讯协议的转换类,利用者发出的指令经过这个转换类的翻译之后,转换为各个厂家,型号使用的协议之后再发出。接下来只要为每台无人机准备好协议转换的数据即可。但是我们面对的是成千上万的无人机,为每台无人机准备这样数据就需要消耗大量的内存。

这个问题可以通过享元模式来解决。由于同一厂家,同一型号的无人机可以接受的命令的种类,形式,通讯方式完全一致,所以我们只要为每个厂家的每个型号提供唯一的一个转换模块就可以了。下面就是这个方案的类图:

Aha!设计模式(64)-享元模式(1)

每次需要使用Translator的时候,利用者调用以厂家和型号为参数,调用TranslatorFactory的GetTranslator方法,如果TranslatorFactory已经持有与厂家,型号相匹配的Translator则直接将其返回,如果没有则生成相应的Translator并返回。这样就保证了每个厂家,型号的无人机只会生成一个Translator,从而避免了内存空间的浪费。