阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

享元

31次阅读
没有评论

共计 1387 个字符,预计需要花费 4 分钟才能阅读完成。

运用共享技术有效地支持大量细粒度的对象。

享元(Flyweight)的核心思想很简单:如果一个对象实例一经创建就不可变,那么反复创建相同的实例就没有必要,直接向调用方返回一个共享的实例就行,这样即节省内存,又可以减少创建对象的过程,提高运行速度。

享元模式在 Java 标准库中有很多应用。我们知道,包装类型如 ByteInteger 都是不变类,因此,反复创建同一个值相同的包装类型是没有必要的。以 Integer 为例,如果我们通过 Integer.valueOf() 这个静态工厂方法创建 Integer 实例,当传入的 int 范围在 -128~+127 之间时,会直接返回缓存的 Integer 实例:

// 享元模式
public class Main {public static void main(String[] args) throws InterruptedException {Integer n1 = Integer.valueOf(100);
        Integer n2 = Integer.valueOf(100);
        System.out.println(n1 == n2); // true
    }
}

对于 Byte 来说,因为它一共只有 256 个状态,所以,通过 Byte.valueOf() 创建的 Byte 实例,全部都是缓存对象。

因此,享元模式就是通过工厂方法创建对象,在工厂方法内部,很可能返回缓存的实例,而不是新创建实例,从而实现不可变实例的复用。

提示

总是使用工厂方法而不是 new 操作符创建实例,可获得享元模式的好处。

在实际应用中,享元模式主要应用于缓存,即客户端如果重复请求某些对象,不必每次查询数据库或者读取文件,而是直接返回内存中缓存的数据。

我们以 Student 为例,设计一个静态工厂方法,它在内部可以返回缓存的对象:

public class Student {// 持有缓存:
    private static final Map<String, Student> cache = new HashMap<>();

    // 静态工厂方法:
    public static Student create(int id, String name) {String key = id + "\n" + name;
        // 先查找缓存:
        Student std = cache.get(key);
        if (std == null) {// 未找到, 创建新对象:
            System.out.println(String.format("create new Student(%s, %s)", id, name));
            std = new Student(id, name);
            // 放入缓存:
            cache.put(key, std);
        } else {// 缓存中存在:
            System.out.println(String.format("return cached Student(%s, %s)", std.id, std.name));
        }
        return std;
    }

    private final int id;
    private final String name;

    public Student(int id, String name) {this.id = id;
        this.name = name;
    }
}

在实际应用中,我们经常使用成熟的缓存库,例如 Guava 的 Cache,因为它提供了最大缓存数量限制、定时过期等实用功能。

练习

使用享元模式实现缓存。

下载练习

小结

享元模式的设计思想是尽量复用已创建的对象,常用于工厂方法内部的优化。

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计1387字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中