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

在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。

版权声明:著作权归作者所有。

相关推荐

Nginx配置代理gRPC

Nginx 1.13.10新增了对gRPC的原生支持。本文介绍如何配置Nginx的gRPC。安装NginxNginx版本要求:1.13.10。gRPC必须使用HTTP/2传输数据,支持明文和TLS加密数据,支持流数据的交互。这是为了充分利用 HTTP/2 连接的多路复用和流式特性。所以在安装部署nginx时需要安装http/2。使用源码安装,编译时需要加入http_s

Python安全创建目录的方法

在介绍Python安全创建目录之前,先举一个不安全创建目录的方式:if not os.path.exists(directory):     os.makedirs(directory) 在例子里,先判断目录是否存在,然后创建目录。这种方式是不安全的,它会导致竞争条件。在os.path.exists()和os.makedirs()之间的时

基于RxJava和Kotlin封装类处理网络加载数据

在Android开发里,常常需要处理网络加载数据,这里基于RxJava,和Kotlin的Sealed class(封装类)的特性实现的一个示例。Resource.kt首先使用Kotlin的sealed class实现Resource.kt,它用来包装数据和状态。sealed class Resource<out T> { &n

Java创建文件的常用方法

Java创建文件有几种常用的方法File.createNewFile()创建空白文件java.io.File类里的方法createNewFile()可以用来创建文件。createNewFile()新建的是空文件。创建文件首先要使用File类构建将要被创建的文件,然后再调用createNewFile()把新文件创建出来。createNewFile()的结果分为三种情况:新文件创建成功返回true。如

Java HTTP代理设置以及认证

代理设置java http/https设置代理有两种方式:使用系统属性设置以及使用Proxy设置。使用系统属性设置代理String PROXY_HOST = "127.0.0.1";//代理服务器地址 String PROXY_PORT = "80";//代理服务器端口   //HTTP代理 System.setProperty("http.proxyHost", PROXY_HOST); Sy