本文共 1728 字,大约阅读时间需要 5 分钟。
在软件系统中,随着对象数量的增加,内存占用和性能问题日益严重。例如,文本字符串中大量重复字符的处理,若每个字符都用单独对象表示,会导致内存占用过高。这种情况下,如何避免大量对象占用,同时保持对象操作的灵活性,成为一个重要课题。享元模式(Flyweight Pattern)通过共享技术,解决了这一问题。
享元模式通过共享对象实现细粒度对象的高效复用。其核心在于区分内部状态和外部状态:
享元模式通过将相同内部状态的对象共享,减少内存占用,提升性能。例如,文本字符串中的字符可以共享同一实例,仅外部状态(如颜色或大小)不同。
享元模式通常与工厂模式结合使用,其结构包括:
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/