TShopping

 找回密碼
 註冊
搜索
查看: 98|回復: 0

[教學] 如何讓很多activity共用一個物件 獨體模式getInstance?Intent?

[複製鏈接]
發表於 2018-8-29 22:30:24 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 
情境
假設我們有一個物件,要如何把它從目前的activity丟到另外一個activity,
上網查,找到了一個設計模式叫做 Singleton 真的超好用的,

程式碼說明
簡單說明一下

假設有一個類別, 在目前的Activity裡面設定好狀態了,
但是你又想讓這個類別保留著, 然後到另外一個Activity裡面拿出來用,
這時候你該怎麼辦呢? 這時候你會想到靜態類別, 但是你要如何能夠保證,
你生出來的類別,不會被濫用呢?
這時候Singleton就是一個好方法。
它可以讓你只產生一個物件。
假設你有一個類別 叫做Singleton長這樣

  1. class Singleton{
  2.     public Singleton(){}
  3. }
複製代碼

那你想要建立這個類別的物件
你可能會這樣做

  1. Singleton single = new Singleton();
複製代碼

但是如果你要讓別人沒辦法自由的建立這個類別的物件
你可以這樣做

  1. class Singleton{
  2.     private Singleton(){}
  3. }
複製代碼

那這樣誰能夠存取?
當然只剩下自己能夠存取囉!
所以接下來你可以這樣寫,

  1. class Singleton{
  2.     private static Singleton single;
  3.     private Singleton(){}
  4.     public static Singleton getInstance(){   
  5.         single = new Singleton();
  6.     }
  7.     return single;
  8. }
複製代碼

如此一來, 只要呼叫Singleton.getInstance()就可以產生一個物件了。

可是這樣又不太對, 如果每個人都一直呼叫A.getInstance();
不就還是建立一堆物件, 所以加上幾行限制

  1. class Singleton{

  2.     private static Singleton single;
  3.     private Singleton(){}
  4.     public static Singleton getInstance(){
  5.         if(single == null){
  6.             single = new Singleton();   
  7.         }
  8.         return single;
  9.     }
  10. }
複製代碼

這樣一來, 就只能產生一個物件, 可是這時候卻又出現了一個問題,
假設有兩個執行緒同時存取這個類別的getInstance這個方法,
如果我們的直行順序變成這樣:

A 執行緒 跑到了 第五行 時間到了
B 執行緒 跑到了 第五行 時間到了
A 執行緒 在第六行 建立一個物件。
B 執行緒 在第六行 建立一個物件。
違反 Singleton的原則 : 只建立一個物件。

所以我們只需要將getInstance() 變成一個同步化的方法, 就可以將上面的問題解決掉了。

  1. class Singleton{
  2.     private static Singleton single;
  3.     private Singleton(){}
  4.     public static synchronized Singleton getInstance(){   
  5.         if(single == null){   
  6.             single = new Singleton();
  7.         }
  8.         return single;
  9.     }
  10. }
複製代碼

ya, 解決了。
並沒有。

synchronized是很耗效能的, 如果大量的呼叫這個方法, 你的電腦會有一群耗能執行緒再折磨你的電腦,而且這些並沒有意義, 其實如果第一次完成new以後, 根本不需要再對getInstance做同步了。

所以又開發了一個想法, 那如果我們一開始程式就幫你把物件new好了呢?

  1. class Singleton{
  2.     private static Singleton single = new Singleton();
  3.     private Singleton(){}
  4.     public static Singleton getInstance(){     
  5.         return single;
  6.     }
  7. }
複製代碼

這樣一來, 雖然少了Lazy Initialization(延遲出屎化初始化:需要用到物件的時候才建立),
如果你的類別不是吃很大的資源,其實這樣就很夠用了。

那我們回到原本的題目: 如何讓一個物件在很多個activity穿梭呢?

假設你寫了一個貓類別

  1. class Cat{
  2.     private static Cat candy = new Cat();
  3.     private Cat(){}
  4.     public static Cat getMyCat(){
  5.         return candy;
  6.     }
  7.     //其他方法
  8. }
複製代碼

然後在A activity

  1. public class A extends Activity {
  2.     public void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.         Cat candy = Cat.getMyCat();
  5.         //作一些設定

  6.         Intent i = new Intent();
  7.         i.setClass(A.this, B.class);
  8.         startActivity(i);//跳到B頁面
  9.     }
  10. }
複製代碼

然後在B activity display

  1. public class B extends Activity{
  2.     public void onCreate(Bundle savedInstanceState){
  3.         super.onCreate(savedInstanceState);   
  4.         Cat candy = Cat.getMyCat();
  5.         //取得一些資訊
  6.         //display
  7.     }
  8. }
複製代碼

這樣表示無論你在哪裡就可以存取Cat類別的物件,
也等同於,把某個物件傳到另外一個Activity。

文章出處:http://givemepass.blogspot.com/2011/10/activity.html

 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2018-9-23 01:40 , Processed in 0.060659 second(s), 21 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表