博客
关于我
设计模式系列之享元模式(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/

    你可能感兴趣的文章
    NSURLSession下载和断点续传
    查看>>
    NSUserdefault读书笔记
    查看>>
    NS图绘制工具推荐
    查看>>
    NT AUTHORITY\NETWORK SERVICE 权限问题
    查看>>
    NT symbols are incorrect, please fix symbols
    查看>>
    ntelliJ IDEA 报错:找不到包或者找不到符号
    查看>>
    NTFS文件权限管理实战
    查看>>
    ntko web firefox跨浏览器插件_深度比较:2019年6个最好的跨浏览器测试工具
    查看>>
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    ntp server 用法小结
    查看>>
    ntpdate 通过外网同步时间
    查看>>
    ntpdate同步配置文件调整详解
    查看>>
    NTPD使用/etc/ntp.conf配置时钟同步详解
    查看>>
    NTP及Chrony时间同步服务设置
    查看>>
    NTP服务器
    查看>>
    NTP配置
    查看>>
    NUC1077 Humble Numbers【数学计算+打表】
    查看>>
    NuGet Gallery 开源项目快速入门指南
    查看>>
    NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
    查看>>
    nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引
    查看>>