享元模式讲解


我们先看一下享元模式的定义和类型,首先他的定义是说享元模式提供了减少对象数量从而改善应用所需的对象结构的方式,

那看一下补充定义,运用共享技术,有效地支持大量细粒度的对象,类型是结构型

那一句话来概括他呢,就是减少创建对象的数量,从而减少内存的占用,并且呢提高性能,那看一下享元模式的适用场景,

常常应用于系统底层的开发,以便解决系统的性能问题,打个比方,例如JAVA中的String类型,就是使用了享元模式,

那JAVA中的String,如果有则返回,如果没有则创建一个字符串,并且保存在字符串的缓存里面,另外一个就是数据库的连接池,

那里面也都是创建好的,连接池对象,需要的话直接拿来用,不需要就放回去,那这些都是享元模式的适用场景,那在系统中,

如果有大量的对象时,就有可能造成内存溢出,那我们把其中共同的部分,抽象出来,如果有相同的业务请求,我们则返回内存中

的已有对象,避免重新创建,那第二个场景呢,就是系统有大量的相似对象,需要缓冲池的场景,那这一点呢我们详细来说,例如系统

中存在大量的细粒度对象,并且这些细粒度的对象中,大部分都可以外部化,那后面我们会讲一下,享元模式的外部化,和内部化,

也非常好理解,那再延伸一句呢,也就是说享元模式,里面所讲的,大量的相似对象,注意呢是相似对象,那如果我们的软件系统

不依赖于这些对象的身份,打个比方,我们随便拿出来一个对象,认为他们都是相同的,我们根本分辨不出来,那对于这些详细的场景,

我们都可以使用享元模式,但是第一个享元对象,肯定是占用内存的,那如果使用率高的话,那就非常划算,所以我们应该有足够多的

享元对象,可供共享时,值得我们使用享元模式,如果我们的复用度非常非常低,那我们是没有必要使用享元模式的,这里要注意一下

享元模式的优点呢,最大的优点也最容易理解,减少对象的创建,降低内存中对象的数量,降低系统的内存,

同时也可以提高了效率,还有减少内存之外的其他资源的占用,那这个怎么理解呢,减少内存的占用我们能理解,那其他的资源

还有什么呢,打个比方,时间是一种资源,我们通过new关键字,来生成实例的时候,是要消耗时间的,那通过享元模式,共享对象

呢,可以减少使用new关键字,生成实例的次数,这样也就提高了程序的执行次数,还有操作系统中连接句柄和创建句柄,也都是

一种资源,那在不同的操作系统中,可以同时使用的文件句柄,和串口句柄,都是有限制的,那如果我们不共享对象的话,那应用

程序在运行时,很容易达到资源极限,而导致系统崩溃

那我们看一下享元模式有什么缺点呢,最主要的是我们要关注内部和外部的状态,同时关注线程安全问题,

那为了使用享元对象,大部分使用的都是HashMap,如果使用Hashtable的话,那有可能得不偿失,因为里面有同步锁,

都要等待,那折中可以使用ConcurrentHashMap,同时还要关注内外部状态,那内部和外部的状态我们后面会说,第二个是

使系统,程序的逻辑复杂化,那因为使用了享元对象,提高了系统的复杂度,我们还要分辨出外部状态和内部状态,而且呢

外部状态不应该随着内部状态的变化而变化,否则我们的系统就混乱了,也就是说在使用享元模式的时候,可能会造成

我们的程序逻辑会比较复杂,打个比方,JDK里面的Integer里面是有个缓存的,你们也有兴趣可以看一下,后边我们在

讲解源码的时候,也会讲一下,那对于不知道Integer这个类呢,享元模式应用的,在使用的时候,尤其在判断等于的时候,

有可能认为这里比较复杂

我们看一下享元模式的一个扩展,是内部状态,那什么是内部状态呢,内部状态是指在享元模式的内部,

并且不会随着环境改变,而改变的共享部分,也就是说外部环境怎么变,我都不变,并且这个状态,在享元模式的内部,

那随着环境改变而改变的,就是外部状态,这种状态是不可以共享的状态,这个状态是记录在享元对象的外部的,那如果

我们用大白话来说,内部状态我们可以认为是享元对象的一个属性,这个属性不会随着外部环境的变化而变化,外部状态

我们打个比方,我们要用享元模式获取享元对象的时候,我们通过方法的参数传过来一个状态,例如说int,0的时候是什么,

1的时候是什么样,那这种就是大白话来说,同时也是为了加深理解

我们再看一下享元模式的相关模式,首先享元模式和代理模式,那你们都知道,代理模式肯定是要代理一个类,

那如果生成这个代理类,需要花费的资源和时间,都比较多,那就可以使用享元模式来提高程序的处理速度,

这个很好理解,那我们来看一下享元模式和单例模式,那在我们前面讲单例模式的时候,你们一定学习了容器单例,

那这个就是享元模式和单例模式的一个结合,那享元模式就是一个复用对象的思想,至于到底如何使用,何时使用,

这个还是要看我们具体的业务逻辑情况而定

猜你喜欢

转载自blog.csdn.net/Leon_Jinhai_Sun/article/details/90898404