上一篇 OkHttp設(shè)計模式剖析(七)迭代器模式
OKHTTP:
由大名鼎鼎的Square公司開發(fā)的網(wǎng)絡(luò)通信庫银锻。
設(shè)計模式:
軟件開發(fā)中問題的解決套路。
工廠模式簡介
定義:定義一個算法的框架涌萤,二將一些步驟延遲到子類中,使子類可以不改變算法的結(jié)構(gòu)即可重新定義某些特定步驟。
在任何需要生成復雜對象的地方,都可以使用工廠模式雹食,復雜對象適合使用工廠模式,用new就可以完成創(chuàng)建的對象無需使用工廠模式期丰。
因為現(xiàn)實代碼中群叶,當工廠很復雜,產(chǎn)品也很復雜時钝荡,工廠生產(chǎn)產(chǎn)品(不分離)這個類就及其復雜難以管理街立。工廠模式事實上就是用一個“接口”,將工廠和產(chǎn)品解耦(將創(chuàng)建對象和使用對象解耦)埠通,這樣代碼好管理赎离。
若源代碼中有Factory這個詞,大概率使用了工廠模式端辱。
Call.Factory接口中的工廠模式
平時使用OkHttp框架都是用下面的套路:
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().build();
Response response = client.newCall(request).execute();
其中OkHttpClient.java中的newCall函數(shù)源碼如下
@Override public Call newCall(Request request) {
return RealCall.newRealCall(this, request, false /* for web socket */);
}
上述源碼其實是在實現(xiàn)Call接口
public interface Call extends Cloneable {
Request request();
Response execute() throws IOException;
void enqueue(Callback responseCallback);
void cancel();
boolean isExecuted();
boolean isCanceled();
Call clone();
interface Factory { // 此處就是上述源碼實現(xiàn)Factory接口
Call newCall(Request request);
}
}
一言以蔽之梁剔,OkhttpClient實現(xiàn)了Call.Factory接口。其實此處的工廠模式并不典型舞蔽,包括OkHttp框架中RealCall實現(xiàn)Call接口用的工廠模式也并典型荣病。因為他只要Call一個子類,也只用RealCall實現(xiàn)該子類渗柿。換句話說个盆,這個工廠的產(chǎn)品只有一個。但是這里用到了工廠模式的中心思想,將搭建復雜對象將的細節(jié)交待給RealCall實現(xiàn)颊亮,我們只管得到Call即可柴梆。
基于工廠模式構(gòu)建的其他代碼
1、OkHttp框架中RealCall實現(xiàn)Call接口
2终惑、Android源碼中的onCreate方法
簡單工廠模式(靜態(tài)工廠模式)示例
// 產(chǎn)品的抽象類
public abstract class Product {
public abstract void manufacture();
}
// 產(chǎn)品A(宜賓燃面)的具體實現(xiàn)
public class ConcreteProA extends Product{
@Override
public void manufacture() {
System.out.println("我是宜賓燃面绍在!");
}
}
// 這是一個簡單工廠
public class Factory {
public static Product createProduct() { // 注意這個static
return new ConcreteProA();
}
}
若工廠類只有一個,就是只生產(chǎn)一種產(chǎn)品狠鸳,那么就簡化掉抽象類揣苏,將工廠方法改成靜態(tài)方法。
我們將這個示例跑一下
public class Main {
public static void main(String[] args){
Factory f = new Factory();
Product p = f.createProduct();
p.manufacture();// 輸出: 我是宜賓燃面件舵!
}
}
這個工廠可以一直生產(chǎn)宜賓燃面卸察。其實這樣看起來,沒必要用工廠啊铅祸,就直接做面就好啊坑质。但事實上,我們屏蔽了工廠里面采購临梗、和面涡扼、調(diào)醬等過程,只管拿生產(chǎn)出來的宜賓燃面盟庞。同時吃沪,工廠也不去管你宜賓燃面是自己吃還是請別人吃∈膊互相屏蔽票彪,不打攪。
參考文獻
1不狮、設(shè)計模式|菜鳥教程:https://www.runoob.com/design-pattern/design-pattern-tutorial.html
2降铸、《Android源碼設(shè)計模式解析與實戰(zhàn)》何紅輝,關(guān)愛民著
3摇零、隔壁老李頭:http://www.reibang.com/p/82f74db14a18