一、定义
利用共享技术,支持相同对象的复用。
二、两种不同的状态
内部状态与外部状态。内部状态可以视为共性,而外部状态可以视为个性。而在面向对象编程中,共性部分可以定义为享元对象的属性,它是享元类的对象所共享的。而外部状态可以将其定义为方法上接收的参数,每次传过来的都可能不一样。
内部状态:在享元对象内部不随外部环境而改变的共享部分。
外部状态:外部状态取决于具体的业务场景,并根据场景而变化,它是不可以共享的状态。外部状态在“使用环境”中指明。
三、优缺点
优点:
1.大量减少内存中对象的数量,它将具有相同内部状态的对象存放到享元池中(HashMap),相同或者相似对象在内存中只存放一份。一言以蔽之:减少对象的数量,节约内存空间。
2.外部状态不影响内部状态,因此享元对象可以在很多不同环境中复用。
缺点:
1.享元工厂中需要一个享元池,它用于记录系统中已有的享元列表。一般由HashMap这样的具有键值对功能的对象来维护。这本身就要耗费系统性能。
2.为了使对象可以共享,需要将一些状态外部化。而这些外部环境往往也被封装成了一个新的类,这增加了系统的复杂性。
四、享元设计模式心法
1.第一条就是应当在系统中有足够多的对象实例可以共享时才值得使用享元模式。例如围棋系统,五子棋系统。围棋,它的颜色是内部状态,由黑色与白色组成,而它的坐标是外部状态。如果不用享元设计模式,那么将会产生若干个围棋实例对象。使用了享元设计模式,围棋实例对象只需要创建两个。
2.第二条是享元对象的外部状态应该尽可能多。这样的话,少量享元对象可以在不同环境中替换大量的其它对象。其它对象共享一个享元对象的内存。
五、享元设计模式与单例设计模式的区别
单例设计模式强调一个类只有一个实例对象,那么这个实例对象不管在什么调用环境下都是相同的。而享元设计模式中的享元对象,它共享的只是内部状态,它在不同的调用环境中有不同的外部状态,因此这个享元对象在不同调用环境中各不相同。
分割线--------------------------------------------------------------------------------------------
下一篇:模版方法模式15