zl程序教程

您现在的位置是:首页 >  后端

当前栏目

设计模式之原型模式

2023-09-14 09:12:27 时间

该模式又称之为克隆模式,该模式相对来说很简单。其实这个模用一个词来形容最恰当不过,这个词就是“依葫芦画瓢”。之所以使用克隆模式创建一个对象,可能就是直接创建该对象的代价和成本较大,比如在昂贵的数据库操作之后要创建一个对象。我们可以缓存对象,在下一个请求时返回其克隆,并在需要时更新数据库,从而减少数据库调用。这样,即达到了创建对象的目的,也减少了对数据库的频发操作。何乐而不为。

使用过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后的对象,在这里就不再赘述了。