代理模式:Java基于虚拟代理(Virtual Proxy)懒加载创建耗时的对象

时间:2021-10-13 16:37:45

在java里有一些对象在创建初始化时是比较耗时,如JDBC的connection,有的时候我们希望只用到对象的简版,这种情况下我们可以使用代理的方式,在真正用到原始对象是在初始化耗时的对象。这种代理方式也叫虚拟代理(Virtual PRoxy)

UML类图如下:

代理模式:Java基于虚拟代理(Virtual Proxy)懒加载创建耗时的对象

定义耗时类的接口

public interface ExpensiveObject {
void process();
}

实现接口:

```

public class ExpensiveObjectImpl implements ExpensiveObject {
public ExpensiveObjectImpl() {
heavyInitialConfiguration();
}
@Override
public void process() {
LOG.info("processing complete.");
}
private void heavyInitialConfiguration() {
LOG.info("Loading initial configuration...");
}
}

创建代理

public class ExpensiveObjectProxy implements ExpensiveObject {
private static ExpensiveObject object;
@Override
public void process() {
if (object == null) {
object = new ExpensiveObjectImpl();
}
object.process();
}
}

可以看到,process()是需要用到耗时对象,在代理的process()方法里会判断耗时对象是否已经创建,未创建则构造,如果已创建则直接对用原始对象的process()方法。

优点:

在应用程序启动时,由于不需要创建和装载耗时的对象,这就加速了应用程序的启动。这也是使用懒加载的原因。

缺点:

因为不能保证使用对象时是否被创建了,所以在访问这个对象的任何地方,都需要检测对象是否为null。