该模式又称之为克隆模式,该模式相对来说很简单。其实这个模用一个词来形容最恰当不过,这个词就是“依葫芦画瓢”。之所以使用克隆模式创建一个对象,可能就是直接创建该对象的代价和成本较大,比如在昂贵的数据库操作之后要创建一个对象。我们可以缓存对象,在下一个请求时返回其克隆,并在需要时更新数据库,从而减少数据库调用。这样,即达到了创建对象的目的,也减少了对数据库的频发操作。何乐而不为。
使用过Okhttp这个类的创建还是挺复杂的,而且这个类本身也提供了一个clone方法:
class OkhttpClient implement Cloneable{
/** Returns a shallow copy of this OkHttpClient.
返回一个OkhttpClient的浅拷贝 */
@Override public OkHttpClient clone() {
return new OkHttpClient(this);
}
}
//注意构造器时候私有的
private OkHttpClient(OkHttpClient okHttpClient) {
this.routeDatabase = okHttpClient.routeDatabase;
this.dispatcher = okHttpClient.dispatcher;
this.proxy = okHttpClient.proxy;
this.protocols = okHttpClient.protocols;
this.connectionSpecs = okHttpClient.connectionSpecs;
this.interceptors.addAll(okHttpClient.interceptors);
this.networkInterceptors.addAll(okHttpClient.networkInterceptors);
this.proxySelector = okHttpClient.proxySelector;
this.cookieHandler = okHttpClient.cookieHandler;
this.cache = okHttpClient.cache;
this.internalCache = cache != null ? cache.internalCache : okHttpClient.internalCache;
this.socketFactory = okHttpClient.socketFactory;
this.sslSocketFactory = okHttpClient.sslSocketFactory;
this.hostnameVerifier = okHttpClient.hostnameVerifier;
this.certificatePinner = okHttpClient.certificatePinner;
this.authenticator = okHttpClient.authenticator;
this.connectionPool = okHttpClient.connectionPool;
this.network = okHttpClient.network;
this.followSslRedirects = okHttpClient.followSslRedirects;
this.followRedirects = okHttpClient.followRedirects;
this.retryOnConnectionFailure = okHttpClient.retryOnConnectionFailure;
this.connectTimeout = okHttpClient.connectTimeout;
this.readTimeout = okHttpClient.readTimeout;
this.writeTimeout = okHttpClient.writeTimeout;
}
在Java中,各个对象的老祖就是Object这个对象,该类提供了一个clone方法,顾名思义,这个方法就是用来克隆对象的。 可以看出,当一个类要重写Object的clone方法的时候,该类必须要集成 Cloneable这个接口,最终会调用internalClone这个方法。 当然,具体clone方法具体怎么实现,就要看自己的需求了,是深copy还是浅copy,全看自己怎么使用clone后的对象,在这里就不再赘述了。