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

    你可能感兴趣的文章
    Node读取并输出txt文件内容
    查看>>
    node防xss攻击插件
    查看>>
    noi 1996 登山
    查看>>
    noi 7827 质数的和与积
    查看>>
    NOI-1.3-11-计算浮点数相除的余数
    查看>>
    noi.ac #36 模拟
    查看>>
    NOI2010 海拔(平面图最大流)
    查看>>
    NOIp2005 过河
    查看>>
    NOIP2011T1 数字反转
    查看>>
    NOIP2014 提高组 Day2——寻找道路
    查看>>
    noip借教室 题解
    查看>>
    NOIP模拟测试19
    查看>>
    NOIp模拟赛二十九
    查看>>
    Vue3+element plus+sortablejs实现table列表拖拽
    查看>>
    Nokia5233手机和我装的几个symbian V5手机软件
    查看>>
    non linear processor
    查看>>
    Non-final field ‘code‘ in enum StateEnum‘
    查看>>
    none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
    查看>>