已經轉做Android半個月了 設計模式還不怎么了解 從今天起就從最簡單的單例模式開始吧!
###說得不對的還請各位來battle (粗體是重點,物件 和 實體 是一個意思)
單例模式singleton
顧名思義單例模式就是只有一個實體
如:需要班長統計學生資訊的時候(需求) 不用每次找班長的時候都進行選拔(進行實體化) 在整個大學期間(程式運行期間)只選拔一次(實體化一次)就夠了
確保某一個類只有一個實體,而且自行實體化并向整個系統提供這個實體,
優點
顯而易見,在移動端開發程序中 有一些實體化起來比較消耗記憶體的類 索性我們就不回收了 減少gc 保持程式在運行時始終有一個該類的物件在記憶體中 這種方式可以大大提高性能
當物件需要被共享的場合,由于單例模式只允許創建一個物件,共享該物件可以節省記憶體
實作方式
1.必須防止外部可以呼叫建構式進行實體化,私有化構造方法(不對外開放)
2.對外只提供一個獲取本類實體的靜態方法(一個全域訪問點)
3.確保一個類只有一個實體物件
單例模式是設計模式中最簡單的模式之一,通常,普通類的建構式是公有的,外部類可以通過“new 建構式()”來生成多個實體,但是,如果將類的建構式設為私有的,外部類就無法呼叫該建構式,也就無法生成多個實體,這時該類自身必須定義一個靜態私有實體,并向外提供一個靜態的公有函式用于創建或獲取該靜態私有實體,
結構圖UML
主要角色
1.可以自行實體化的單例類SingLeton
2.呼叫它的訪問類Client

實作
通常有兩種實作方式
1.餓漢式(先填飽肚子再說)
/**
* @program: TestSinglet
* @description: 餓漢式
* @author: tkx
* @create: 2021-01-16 14:11
**/
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
在類創建時同時創建好一個靜態物件來提供使用 所以是執行緒安全的
2.懶漢式(你啥時候喊我,我啥時候動彈)
/**
* @program: TestSinglet
* @description: 懶漢式
* @author: tkx
* @create: 2021-01-16 14:21
**/
public class Singleton {
//保證 instance 在所有執行緒中同步
private static volatile Singleton instance = null;
private Singleton() {
} //private 避免類在外部被實體化
public static synchronized Singleton getInstance() {
//getInstance 方法前加同步
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
如果撰寫的是多執行緒程式,則不要洗掉上例代碼中的關鍵字 volatile 和 synchronized,否則將存在執行緒非安全的問題,如果不洗掉這兩個關鍵字就能保證執行緒安全,但是每次訪問時都要同步,會影響性能,且消耗更多的資源,這是懶漢式單例的缺點,
volatile:
被volatile關鍵字修飾的變數,編譯器與運行時都會注意到這個變數是共享的,因此不會將該變數上的操作與其他記憶體操作一起重排序,volatile變數不會被快取在暫存器或者對其他處理器不可見的地方,因此在讀取volatile型別的變數時總會回傳最新寫入的值,
其他實作方式
- 雙重檢查鎖模式(在需要創建物件的時候再進行同步鎖操作 (懶漢中的懶漢))
- 列舉模式(列舉實體在任何情況都是一個單例且是執行緒安全的)
- 靜態內部類實作的單例(單例模式推薦的實作方式 詳情請查閱:JVM類加載機制(類加載程序和類加載器))
最后 我們應用一下單例模式,管理我們的Activity,下面這個可以作為一個工具類
/**
* @program: TestSinglet
* @description: manager
* @author: tkx
* @create: 2021-01-16 14:30
**/
public class ActivityManager {
private static volatile ActivityManager instance;
private Stack<Activity> mActivityStack = new Stack<Activity>();
private ActivityManager(){
}
public static ActivityManager getInstance(){
if (instance == null) {
synchronized (ActivityManager.class) {
if (instance == null) {
instance = new ActivityManager();
}
}
return instance;
}
public void addActicity(Activity act){
mActivityStack.push(act);
}
public void removeActivity(Activity act){
mActivityStack.remove(act);
}
public void killMyProcess(){
int nCount = mActivityStack.size();
for (int i = nCount - 1; i >= 0; i--) {
Activity activity = mActivityStack.get(i);
activity.finish();
}
mActivityStack.clear();
android.os.Process.killProcess(android.os.Process.myPid());
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/249936.html
標籤:其他
下一篇:安卓學習日志 Day07
