23种设计模式之享元模式
享元模式的定义定义: 使用共享对象可有效的支持大量的细粒度的对象 通俗的说,就是将类的通用属性抽出来,建立对象池,以达到限制对象数量的效果 上面定义中要求细粒度对象,那么不可避免的使得对象数量多且性质相近,我们将这些对象的信息分为两个部分: 内部状态和外部状态
说白了,内部状态就是每个对象都不同的属性,外部状态就是数量有限的属性,如性别只有男女等 享元模式的类图如下: 其中的角色:
享元模式的目的在于运用共享技术,使得一些细粒度的对象可以共享 抽象享元角色代码: 抽象享元角色一般为抽象类,在实际项目中一般是一个实现类,它是描述一类事物的方法.在抽象角色中,一般需把外部状态和内部状态定义出来,避免子类的随意扩展. 我们对外部状态加上了final关键字,防止意外发生.获得外部状态,无意修改了一下,池就混乱了. 在程序开发中,确认只需要一次赋值的属性则设置为final类型,避免无意修改导致逻辑混乱. 具体享元角色代码: 享元工厂代码: 享元模式的应用享元模式的优点和缺点: 享元模式是一个非常简单的模式,它可以大大减少应用程序创建的对象,减低程序内存的占用,增强程序的性能,但它同时也提高了系统复杂性,需要分离出外部状态和内部状态,而且外部状态具有固化特性,不应该随内部状态改变而改变,否则导致系统的逻辑混乱 享元模式的使用场景:
享元模式的扩展1.线程安全的问题 当使用享元模式时,对象池中的角色数量是一定的,可能在拿的时候不同线程同时拿到同一个对象.这是就出现线程不安全的问题了 我们在使用享元模式时要注意这个问题. 我们在使用享元模式时,对象池中的享元对象尽量多,多到足够满足业务为止 2.性能平衡 既然是面向对象编程,我们何不将外部状态抽离出来,定义为一个对象呢? 经过测试,外部状态使用对象要比使用基本类型效率低. 所以,外部状态最好以Java的基本类型作为标志,如stirng、int等,可以大幅的提升效率 享元模式在Java API中也是随处可见. 如Java的String就实现了对象池 需要说明一下的是,虽然可以使用享元模式实现对象池,但是这两者还是有比较大的差异,对象池着重在对象的复用上,池中的每个对象是可替换的,从同一个池中获得的A对象和B对象对客户端来说是完全相同的,它主要解决复用,而享元模式主要解决对象的共享问题,如何建立多个可共享的细粒度对象是其关注的重点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |