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

    你可能感兴趣的文章
    Objective-C实现AlphaNumericalSort字母数字排序算法(附完整源码)
    查看>>
    Objective-C实现alternate disjoint set不相交集算法(附完整源码)
    查看>>
    Objective-C实现alternative list arrange备选列表排列算法(附完整源码)
    查看>>
    Objective-C实现An Armstrong number阿姆斯特朗数算法(附完整源码)
    查看>>
    Objective-C实现anagrams字谜算法(附完整源码)
    查看>>
    Objective-C实现ApproximationMonteCarlo蒙特卡洛方法计算pi值算法 (附完整源码)
    查看>>
    Objective-C实现area under curve曲线下面积算法(附完整源码)
    查看>>
    Objective-C实现arithmetic算术算法(附完整源码)
    查看>>
    Objective-C实现armstrong numbers阿姆斯壮数算法(附完整源码)
    查看>>
    Objective-C实现articulation-points(关键点)(割点)算法(附完整源码)
    查看>>
    Objective-C实现atoi函数功能(附完整源码)
    查看>>
    Objective-C实现average absolute deviation平均绝对偏差算法(附完整源码)
    查看>>
    Objective-C实现average mean平均数算法(附完整源码)
    查看>>
    Objective-C实现average median平均中位数算法(附完整源码)
    查看>>
    Objective-C实现average mode平均模式算法(附完整源码)
    查看>>
    Objective-C实现avl 树算法(附完整源码)
    查看>>
    Objective-C实现AvlTree树算法(附完整源码)
    查看>>
    Objective-C实现backtracking Jump Game回溯跳跃游戏算法(附完整源码)
    查看>>
    Objective-C实现BACKTRACKING 方法查找集合的幂集算法(附完整源码)
    查看>>
    Objective-C实现bailey borwein plouffe算法(附完整源码)
    查看>>