Java 中的虚拟代理模式:利用延迟加载技术提升性能
也称为
- 延迟初始化代理
- 虚拟替身
虚拟代理设计模式的意图
虚拟代理设计模式是 Java 设计模式中的一个重要组成部分,它通过受控的对象创建来实现高效的资源管理和性能优化。它为另一个对象提供了一个代理或占位符,以控制其创建和访问,尤其是在处理资源密集型操作时。
虚拟代理模式的详细解释以及现实世界中的例子
现实世界中的例子
就像一家高端艺术画廊使用照片来节省资源和降低风险一样,Java 中的虚拟代理模式通过仅显示必要的对象来管理资源密集型操作,从而显著提高系统效率。为了保护实际的艺术品并降低损坏或盗窃的风险,画廊最初会展示艺术品的高质量照片。当一位严肃的买家表达了真正的兴趣时,画廊才会从安全的存储区域取出原件进行查看。
在这个类比中,高质量的照片充当实际艺术品的虚拟代理。只有在真正需要的时候才会获取和显示真实的艺术品,从而节省资源并降低风险,这类似于虚拟代理模式在需要时才创建对象的方式。
简单来说
虚拟代理模式允许一个代表类代表另一个类来控制对其的访问,尤其是在资源密集型操作时。
维基百科说
一种代理,它控制对创建成本高的资源的访问。
Java 中虚拟代理模式的编程示例
Java 中的虚拟代理设计模式可以优化资源利用率和系统性能。
考虑一个在线视频流平台,其中视频对象由于其庞大的数据大小和所需的处理能力而成为资源密集型对象。为了有效地管理资源,系统使用虚拟代理来处理视频对象。虚拟代理延迟创建实际的视频对象,直到它们被明确地用于播放,从而节省系统资源并改善用户的响应时间。
鉴于我们关于视频流服务的示例,以下是它的实现方式
首先,我们定义一个 ExpensiveObject
接口,它概述了处理视频的方法。
public interface ExpensiveObject {
void process();
}
以下是 RealVideoObject
的实现,它代表一个创建成本高的视频对象。
@Slf4j
@Getter
public class RealVideoObject implements ExpensiveObject {
public RealVideoObject() {
heavyInitialConfiguration();
}
private void heavyInitialConfiguration() {
LOGGER.info("Loading initial video configurations...");
}
@Override
public void process() {
LOGGER.info("Processing and playing video content...");
}
}
VideoObjectProxy
作为 RealExpensiveObject
的替代品。
@Getter
public class VideoObjectProxy implements ExpensiveObject {
private RealVideoObject realVideoObject;
public void setRealVideoObject(RealVideoObject realVideoObject) {
this.realVideoObject = realVideoObject;
}
@Override
public void process() {
if (realVideoObject == null) {
realVideoObject = new RealVideoObject();
}
realVideoObject.process();
}
}
以下是代理在系统中的使用方式。
public static void main(String[] args) {
ExpensiveObject videoObject = new VideoObjectProxy();
videoObject.process(); // The first call creates and plays the video
videoObject.process(); // Subsequent call uses the already created object
}
程序输出
14:54:30.602 [main] INFO com.iluwatar.virtual.proxy.RealVideoObject -- Loading initial video configurations...
14:54:30.604 [main] INFO com.iluwatar.virtual.proxy.RealVideoObject -- Processing and playing video content...
14:54:30.604 [main] INFO com.iluwatar.virtual.proxy.RealVideoObject -- Processing and playing video content...
何时在 Java 中使用虚拟代理模式
在以下情况下使用虚拟代理模式
- 对象创建是资源密集型的,并非所有实例都立即或永远被使用。
- 通过延迟创建对象直到需要时,可以显著提高系统的性能。
- 需要控制处理大量高开销对象的系统中的资源使用情况。
虚拟代理模式 Java 教程
Java 中虚拟代理模式的现实世界应用
- 延迟初始化:仅在实际需要时创建对象。
- 资源管理:通过仅按需创建重量级对象来有效地管理资源。
- 访问控制:在将调用委托给实际对象之前,包含逻辑以检查条件。
- 性能优化:合并结果或状态的缓存,这些结果或状态获取或计算成本高昂。
- 数据绑定和集成:延迟集成和绑定过程,直到实际需要数据。
- 在 Java 中,
java.awt.Image
类使用虚拟代理来按需加载图像。 - Hibernate ORM 框架使用代理来实现实体的延迟加载。
虚拟代理模式的优点和权衡
优点
- 通过延迟创建对象来减少内存使用量。
- 通过延迟执行繁重的操作直到需要时来提高性能。
权衡
- 在代码库中引入了复杂性。
- 如果没有正确处理,可能会导致意外的行为,尤其是在多线程环境中。