• 享元模式(Flyweight Pattern)


    摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题。但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价。那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作?

    概述

    面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题。但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价。那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作?

    意图

    运用共享技术有效地支持大量细粒度的对象。[GOF 《设计模式》]

    结构图

    效果及实现要点

    1.面向对象很好的解决了抽象性的问题,但是作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。Flyweight设计模式主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。

    2.Flyweight采用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。在具体实现方面,要注意对象状态的处理。

    3.享元模式的优点在于它大幅度地降低内存中对象的数量。但是,它做到这一点所付出的代价也是很高的:享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。另外它将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。

    适用性

    当以下所有的条件都满足时,可以考虑使用享元模式:

    1、   一个系统有大量的对象。

    2、   这些对象耗费大量的内存。

    3、   这些对象的状态中的大部分都可以外部化。

    4、   这些对象可以按照内蕴状态分成很多的组,当把外蕴对象从对象中剔除时,每一个组都可以仅用一个对象代替。

    5、   软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。

    满足以上的这些条件的系统可以使用享元对象。最后,使用享元模式需要维护一个记录了系统已有的所有享元的表,而这需要耗费资源。因此,应当在有足够多的享元实例可供共享时才值得使用享元模式。

    总结

    Flyweight模式解决的是由于大量的细粒度对象所造成的内存开销的问题,它在实际的开发中并不常用,但是作为底层的提升性能的一种手段却很有效。

  • 相关阅读:
    使用squid代理后某些网站无法访问的解决办法(3.1.7版本)
    如何高效设计游戏——从抽奖模型到圆桌算法(下)附VBA教程&战斗模拟器
    squid代理服务器泄露客户ip和服务器信息的解决
    分享squid缓存服务器配置之conf配置文件的详细介绍
    如何高效设计游戏——从抽奖模型到圆桌算法
    在linux下成功使用西部数据高级格式化的硬盘
    squid 高级篇
    squid禁止多线程并发下载的简单方法
    jquery实现搜索框类似提示功
    关于phoneGap camera照片放置的位置问题
  • 原文地址:https://www.cnblogs.com/linjiancun/p/2104882.html
Copyright © 2020-2023  润新知