在java里有一些对象在创建初始化时是比较耗时,如JDBC的connection,有的时候我们希望只用到对象的简版,这种情况下我们可以使用代理的方式,在真正用到原始对象是在初始化耗时的对象。这种代理方式也叫虚拟代理(Virtual PRoxy)
UML类图如下:
定义耗时类的接口
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。