本文是Android面試題整理中的一篇,結合右下角目錄食用更佳html
一個類僅有一個實例,供全局訪問,如下是幾種實現方式git
//餓漢模式
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){};
public Singleton getInstance(){
return instance;
}
}
// 懶漢模式
public class Singleton{
private volatile static Singleton instance = null;
private Singleton(){};
public Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
//靜態內部類(推薦)
public class Singleton{
private static class SingletonHolder{
public static Singleton instance = new Singleton();
}
private static Singleton instance = new Singleton();
private Singleton(){};
public Singleton getInstance(){
return SingletonHolder;
}
}
複製代碼
- 使用一個static的標記位,再次實力化時驗證其值,拋出異常
- 或者使用枚舉
將對象的構建與展現分離,容許用戶在不知道內部構建細節的狀況下,能夠更精細地控制對象的構造流程。github
Android中典型的用到Builder的地方是AlertDialog,如下是構建AlertDialog舉例面試
//顯示基本的AlertDialog
private void showDialog(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setIcon(R.drawable.icon);
builder.setTitle("Title");
builder.setMessage("Message");
builder.setPositiveButton("Button1",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
setTitle("點擊了對話框上的Button1");
}
});
builder.setNeutralButton("Button2",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
setTitle("點擊了對話框上的Button2");
}
});
builder.setNegativeButton("Button3",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
setTitle("點擊了對話框上的Button3");
}
});
builder.create().show(); // 構建AlertDialog, 而且顯示
}
複製代碼
觀察者模式在對象間創建了一對多的關係,當一個對象狀態發生改變時,通知和它關聯的全部對象它的改變,讓這些對象做出相應的調整。算法
在Android中,咱們往ListView添加數據後,都會調用Adapter的notifyDataChanged()方法,其中使用了觀察者模式:當ListView的數據發生變化時,調用Adapter的notifyDataSetChanged函數,這個函數又會調用DataSetObservable的notifyChanged函數,這個函數會調用全部觀察者(AdapterDataSetObserver)的onChanged方法,在onChanged函數中又會調用ListView從新佈局的函數使得ListView刷新界面設計模式
適用場景:被代理的對象A不能直接訪問或者出於對A的保護,不想讓它被直接訪問
給某一個對象A建立一個代理對象B,經過控制B來間接控制A,B與A實現了同一個接口。bash
- 代理能夠分爲靜態代理和動態代理。使用動態代理時咱們須要實現中介類(實現InvocationHandler接口),並調用Proxy.newProxyInstance方法幫助咱們動態生成一個代理。
- Android 的 Binder 中就運用了代理模式
裝飾模式動態的將責任附加到對象上,若要擴展功能,裝飾模式提供了比繼承更有彈性的替代方案app
代理強調限制,裝飾強調加強原有功能函數
將一個類的接口A轉換成客戶但願的另外一個接口B。適配器模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做oop
- 簡單工廠將對象生成的過程進行了封裝9
- 工廠方法根據依賴倒置原則,將對象建立的過程交給子類
- 抽象工廠是爲了生成一族對象,例若有一個生成一套服裝的工廠(生產上衣和褲子),它的實現有休閒工廠/正裝工廠;這個時候若是咱們生成一個休閒工廠實例,並須要紅上衣綠褲子,那麼產出的是休閒紅上衣+休閒綠褲子
命令中包含接受者和一些信息,Client建立命令,並將其交給執行者,執行者沒必要知道命令的細節,只需調用excute執行,命令會調用接受者執行。
外觀模式提供了一個統一的接口,來訪問子系統的一羣接口:實現了客戶和子系統的解偶
當建立對象的成本較大時,咱們能夠選擇原型模式,經過clone已經存在的對象生成一個新的對象
對一個請求,用一條鏈表來處理,鏈表上每個節點都有可能消耗掉這個請求或者繼續傳遞給後邊的節點
Android 中的有序廣播和View的事件分發是典型的責任鏈模式
在一個方法中定義一個算法骨架,而將一些步驟延遲到子類中。
策略模式定義了一系列的算法,並將每個算法封裝起來,並且使他們能夠相互替換,讓算法獨立於使用它的客戶而獨立變化
如安卓動畫中的插值器
將對象組合成樹形結構以表示「部分-總體」的層次結構,單個對象和對象的組合實現了同一個接口,組合模式使得用戶對單個對象和組合對象的使用具備一致性。
Android中典型的例子View,具體的View和ViewGroup都實現了View接口,同時能夠將多個View添加到一個ViewGroup做爲一個總體View。
享元模式是爲數很少的、只爲提高系統性能而生的設計模式。它的主要做用就是複用大對象(重量級對象),以節省內存空間和對象建立時間。
如Andrid 中 Message m = Message.obtain(); 用的就是享元模式
- 模版方法:生命週期
- 裝飾者:ContextWrapper內部有個Context引用mContext
- 解釋器:Manifest中定義Activity
- 備忘錄:Activity的onSaveInstanceState和onRestoreInstanceState