尋找android中的設計模式(三)
尋找工廠模式
工廠模式的家族分四種:靜態工廠模式、簡單工廠模式、工廠方法模式、抽象工廠模式。
下面以開冒菜店為例,假設我定義了一家冒菜店:
public class maocaistore else if (type.equals("zhongla")) else if (type.equals("mala")) else
maocai.prepare();
maocai.fire();
maocai.addtiaoliao();
return maocai;
}}
可以看到,在sellmaocai方法裡面會根據傳入引數不同而做不同口味的冒菜。這樣就違背了oo原則(單一原則,開閉原則等)如果增加一種口味的冒菜,就得修改裡面的**。看下靜態工廠模式的處理方式:
public class staticmaocaifactory else if (type.equals("zhongla")) else if (type.equals("mala")) else
return maocai;
}}
public class maocaistore
}
可以看到比較簡單,只是將建立冒菜的工作交給了staticmaocaifactory中的靜態方法。這樣的好處是增加一種口味的冒菜只要修改staticmaocaifactory中的靜態方法即可,將冒菜店和建立冒菜隔離,冒菜店只負責拿到冒菜開始做就行,至於冒菜的**不關心。
下面看下簡單工廠模式是如何做的:
public class samplemaocaifactory else if (type.equals("zhongla")) else if (type.equals("mala")) else
return maocai;
}}
public class maocaistore
public maocai sellmaocai(string type)
}
可以看出createmaocai不在是乙個靜態方法,而是需要建立工廠物件才能呼叫。好處跟靜態工廠模式一樣,只不過這裡用組合的方式把工廠組合進來。
下面看下工廠方法模式:
定義:定義乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法模式把類例項化的過程推遲到子類。
意思就是把建立冒菜的任務交給冒菜店的子類(各個分店:上海西安),如下:
public abstract class maocaistore
}
public class shanghaimaocaistore extends maocaistore else if (type.equals("zhongla")) else if (type.equals("mala")) else
return maocai;
}}
public class xianmaocaistore extends maocaistore else if (type.equals("zhongla")) else if (type.equals("mala")) else
return maocai;
}}
可以看到,上海分店的工廠專門製造上海口味的冒菜,西安分店的工廠專門製造西安口味的冒菜。再看下定義:
定義乙個建立物件的介面就是,這個方法:
public abstract maocai createmaocai(string type);
最後看下,抽象工廠方法:
定義:提供乙個介面,用於建立相關的或依賴物件的家族,而不需要明確指定具體類。
比如冒菜店提供的各種蔬菜和肉類必須由當地提供,上海得由上海原料工廠提供,西安得由西安原料工廠提供。
下面定義乙個介面用來獲取蔬菜和肉:
public inte***ce maocaiyuanliaofactory
上海原料工廠:
public class shanghaimaocaiyuanliaofactory implements maocaiyuanliaofactory
@override
public void createrou()
}
西安原料工廠:
public class xianmaocaiyuanliaofactory implements maocaiyuanliaofactory
@override
public void createrou()
}
然後在各分店冒菜店裡面組合該冒菜原料工廠:
public class shanghaimaocaistore extends maocaistore
列印結果:
準備獲取上海產的蔬菜
獲取上海產的蔬菜
開抄加調料
下面尋找下
android
原始碼當中是如何使用工廠模式的:
bitmapfactory
中有很多建立點陣圖的靜態方法:(靜態工廠模式)
public static bitmap decodefile(string pathname, options opts)
@override
public joincontactlistadapter createlistadapter()
可以看到子類都實現了該介面來建立需要的介面卡。
**所有者與聯絡人之間的互動。(抽象工廠模式)
根據定義找到介面定義:
/**
* represents a default interaction between the phone's owner and a contact
*/public inte***ce contactinteraction
可以看到這麼多介面用來建立跟聯絡人相關的產品。具體建立哪些物件在實現類裡面提供。
一般跟聯絡人的互動有通話、簡訊、日曆活動。如下:
public class calendarinteraction implements contactinteraction
其他smsinteraction和calendarinteraction也都建立了圖示。
總結
學完了工廠模式後,下面總結下目前涉及oo原則:
封裝變化
多用組合,少用繼承
針對介面程式設計,不針對實現程式設計
為互動物件之間的松耦合設計而努力
類應該對擴充套件開發,對修改關閉
依賴抽象,不要依賴具體類
Android中的設計模式 介面卡模式
從名字上就可以看出介面卡是為了針對介面不匹配的情況,而做出的相容方法,假設我們有乙個已經存在的類adaptee,其中有一些已經存在並實現好的方法methoda。但是客戶不希望呼叫這個類,而是希望呼叫乙個特定的介面例如target介面。於是如果想要呼叫adaptee.methoda 方法,建立乙個ad...
Android中的設計模式之直譯器模式
給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器適用該表示來解釋語言中的句子。當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙個抽象語法樹時,可使用直譯器模式。而當存在以下情況時該模式效果最好 例 s aba ef a cd符號 表示推導 符號 表示閉包,意思就是符號a可...
Android系統設計中的設計模式分析之四
uml中,不同的物件之間的關係有generation,implementation,dependence,association,aggregation,composition這六種關係。其中,generation,implementation,dependence這個比較容易 理解,代表了程式中的...