博客
关于我
设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用
阅读量:437 次
发布时间:2019-03-06

本文共 1728 字,大约阅读时间需要 5 分钟。

享元模式:高效对象管理的艺术

模式概述

在软件系统中,随着对象数量的增加,内存占用和性能问题日益严重。例如,文本字符串中大量重复字符的处理,若每个字符都用单独对象表示,会导致内存占用过高。这种情况下,如何避免大量对象占用,同时保持对象操作的灵活性,成为一个重要课题。享元模式(Flyweight Pattern)通过共享技术,解决了这一问题。

模式定义

享元模式通过共享对象实现细粒度对象的高效复用。其核心在于区分内部状态和外部状态:

  • 内部状态:存储在享元对象内部,不随环境变化,适合共享。
  • 外部状态:随环境变化,不可共享,通常由客户端设置。

享元模式通过将相同内部状态的对象共享,减少内存占用,提升性能。例如,文本字符串中的字符可以共享同一实例,仅外部状态(如颜色或大小)不同。

模式结构图

享元模式通常与工厂模式结合使用,其结构包括:

  • 抽象享元类(Flyweight):提供公共方法,管理内部状态。
  • 具体享元类(ConcreteFlyweight):实现抽象类,存储内部状态。
  • 非共享具体享元类(UnsharedConcreteFlyweight):不适合共享的子类,可直接创建。
  • 享元工厂类(FlyweightFactory):管理享元池,创建和获取享元对象。
  • 模式伪代码

    public class FlyweightFactory {    private Map
    flyweights = new HashMap<>(); public Flyweight getFlyweight(String key) { if (flyweights.containsKey(key)) { return flyweights.get(key); } else { Flyweight fw = new ConcreteFlyweight(); flyweights.put(key, fw); return fw; } }}public class Flyweight { protected Object intrinsicState; public void setIntrinsicState(Object intrinsicState) { this.intrinsicState = intrinsicState; } public void operation(Object extrinsicState) { // 具体逻辑与状态处理 }}public class ConcreteFlyweight extends Flyweight { @Override public void operation(Object extrinsicState) { // 具体逻辑与状态处理 }}

    模式应用

    在JDK中,Integer类型使用享元池优化,缓存常用值:

    public static Integer valueOf(int i) {    if (i >= IntegerCache.low && i <= IntegerCache.high) {        return IntegerCache.cache[i + (-IntegerCache.low)];    }    return new Integer(i);}

    IntegerCache类实现享元池,缓存特定范围内的整数实例。

    优缺点分析

    优点:

    • 减少内存占用,提升性能。
    • 外部状态独立,不影响共享。

    缺点:

    • 维护外部状态复杂化,增加开发成本。
    • 外部状态访问增加运行时间开销。

    适用场景

    • 系统中存在大量相同或相似对象。
    • 对象状态外部化,可通过参数传入。
    • 需要多次重用对象,值得使用享元模式。

    总结

    享元模式通过共享技术优化内存使用,适用于处理大量细粒度对象的问题。其核心在于区分内部与外部状态,实现对象的高效复用。

    转载地址:http://gnguz.baihongyu.com/

    你可能感兴趣的文章
    python判断汉字数目
    查看>>
    python判断文件是空的,如果是空的,就删除
    查看>>
    python判断密码是否正确_python密码判断是否符合要求的方法
    查看>>
    python判断字符串包含中文_Python 判断字符串是否包含中文
    查看>>
    python删除第一行_Python 乱码指北:一行删掉根目录
    查看>>
    Python删除列表元素的三种方法
    查看>>
    python初步学习-python数据类型-集合(set)
    查看>>
    python列表生成字典_Python中将字典转换为列表的方法
    查看>>
    python列表对应元素合并为列表及判断一个列表是几维
    查看>>
    python列表去重复后按照顺序_从包含不可共元素的Python列表中删除重复元素,同时保留顺序?...
    查看>>
    python列表前几个_python之列表
    查看>>
    python列表元组
    查看>>
    Python列表/元组/字典和集合使用
    查看>>
    python列表 行列选择_python_pandas_dataframe_行列选择_切片操作
    查看>>
    python列表
    查看>>
    python列出当前目录、子目录和文件的脚本
    查看>>
    python+flask计算机毕业设计骨科门诊患者档案管理系统(程序+开题+论文)
    查看>>
    python+flask计算机毕业设计高校体测管理系统的设计与实现(程序+开题+论文)
    查看>>
    Python切片对象和__getitem__
    查看>>
    python+flask计算机毕业设计高校体育竞赛成绩管理系统的设计与实现(程序+开题+论文)
    查看>>