享元设计模式

面向对象技术可以很好解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式通过共享技术实现相同或相似对象的重用提高系统资源利用率。

 

概念享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。由于 享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种 对象结构型模式。

在实际使用中,能够共享的内部状态是有限的,因此享元对象一般都设计为较小的对象,它所包含的内部状态较少,这种对象也称为细粒度对象。享元模式的目的就是使用共享技术来实现大量细粒度对象的复用。

享元模式的本质是分离和共享将大量相同或相似对象的状态分为内部状态和外部状态。内部状态既是不变,外部状态时变化的;然后通过共享内部状态,达到减少对象数量并节约内存的目的。【享元模式的核心:将类进行细化,分为内部状态和外部状态。】

享元模式在设计模式中属于:结构型模式【结构型模式所描述的是如何将类和对象结合在一起来形成一个更大的结构,它描述两种不同的事物:类和对象,根据这一点,可分为类结构型和对象结构型模式。类结构型模式关心类的组合,由多个类可以组合成一个更大的系统,在类结构型模式中一般只存在继承关系和实现关系;对象结构型模式关心类与对象的组合,通过关联关系使得在一个类中定义另一个类的实例对象,然后通过该对象调用其方法。根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系,因此大部分结构型模式都是对象结构型模式。转载自 https://www.cnblogs.com/bayu/p/8919882.html】。从概念上分析,装饰者设计模式也数据对象型模式

享元模式类型:简单享元模式和复杂享元模式,对应的简单享元类和复杂享元类。

干什么:解决对象实例过多造成的性能下降,这里的对象指对象简单,但是大量创建,造成内存紧张。

技术解说:享元模式是一种数据分享技术。作用:有大量相同或相似对象创建,造成服务器资源告急。。享元模式将这种对象拆分:内部状态、外部状态。

     内部状态:不会随外部信息的变化的。比如:公用的函数,颜色、形状、性别、公司名字...都可以看作内部状态,这部分可以共享的数据抽出来,创建为享元类。

     外部状态:随外部信息而变化。变化的信息是体现数据的价值。比如:独有的函数、姓名、年龄等时刻变化。将这部分变化的数据抽离出来,就是非享元类。

内部状态可以共享,外部状态不能共享。

内部状态和外部状态没有固定的形式。需要根据业务进行

 

享元模式的结构

抽象享元角色

所有具体享元类的父类,规定一些实现的公共接口。非享元类不能实现它。

 

具体享元类角色

抽象享元角色的实现类。

享元类需要接受非享元类【为什么?数据因变化才有价值】。享元类是共享数据,一旦创建里面的数据不能修改,所以里面的不要有可以修改成员属性值的方法。

享元类可以有多个,但是应该尽量减少享元类的个数。

享元工厂角色

负责创建和管理享元角色。将创建的享元角色存放到HashMap或Hash Table中进行管理。确保使用的一个享元的实例对象。

享元类:

          注意享元类性质:共享对象是只读的,如果修改共享就不成立了。       

          创建享元类注意点:享元类不需要给set方法,因为创建后内部状态不能发生变化

          享元类的选取:享元类不变的、具有相同或相似对象。享元类的变化不能太多。:是大量相同或相似对象被创建

UML类图:

                           

代码实例:

简单享元模式代码实例:https://blog.csdn.net/zhuoyuezhang/article/details/87397864

复杂享元模式代码实例:https://blog.csdn.net/zhuoyuezhang/article/details/87456326

复杂享元模式

          复杂享元模式是简单享元模式和合成模式的集合。

          复杂享元模式是在简单享元模式的基础上发展起来的。要实现复杂享元模式,首先实现简单享元模式。

         复杂享元类:该享元类中需要有一个保存简单享元类的成员的集合,目的是保存简单享元的组合结果。

         复杂享元工厂:在简单享元工厂的基础上构建出来的。

 

测试使用享元模式是否有效减少了内存开销和创建对象消耗的时间:代码示例:https://blog.csdn.net/zhuoyuezhang/article/details/87398638

总结:

享元模式解决的问题:面向对象很好地解决了抽象问题,但是作为一个运行在机器中的程序实体,我们需要考虑创建对象的代价问题。Flyweigth主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。

Flyweigth采用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统代理的内存压力。具体实现方式,要注意对像状态的处理,分内部状态、外部状态。

对象的数量太大从而导致对象内存开销加大----什么样的数量才算大?这需要我们仔细的根据具体应用情况进行评估,而不能凭空臆断。

设计模式中的特殊地位:在设计模式中只有Singleton、Flyweigth模式解决代价问题。

 

根据系统内存,评估占用的系统内存,Flyweigth的理念是共享,具体实现有很多种。根据应用场景自己设计结构

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值