Android和設計模式:享元模式

 
    最近在繼續iPhone 業務的同時還須要從新拾起Android 。在有些生疏的狀況下,決定從Android 源碼中感悟一些Android 的風格和方式。在學習源碼的過程當中也發現了一些通用的模式,但願經過一個系列的文章總結和分享下。

    享元模式是一種針對大量細粒度對象有效使用的一種模式。Android中的Message、Parcel和TypedArray都利用了享元模式。以Message爲例,類圖以下:
clip_p_w_picpath002
    其中Message經過next成員變量保有對下一個Message的引用,從而構成了一個Message鏈表。Message Pool就經過該鏈表的表頭管理着全部閒置的Message,一個Message在使用完後能夠經過recycle()方法進入Message Pool,並在須要時經過obtain靜態方法從Message Pool獲取。實現代碼以下:
public final class Message implements Parcelable {
    ......
    // sometimes we store linked lists of these things
    /*package*/ Message next;
    private static final Object sPoolSync = new Object();
    private static Message sPool;
    private static int sPoolSize = 0;
    private static final int MAX_POOL_SIZE = 10;     /**      * Return a new Message instance from the global pool. Allows us to      * avoid allocating new objects in many cases.      */     public static Message obtain() {         synchronized (sPoolSync) {             if (sPool != null) {                 Message m = sPool;                 sPool = m.next;                 m.next = null;                 sPoolSize--;                 return m;             }         }         return new Message();     }     ......     public void recycle() {         synchronized (sPoolSync) {             if (sPoolSize < MAX_POOL_SIZE) {                 clearForRecycle();                 next = sPool;                 sPool = this;                 sPoolSize++;             }         }     }     ......     /*package*/ void clearForRecycle() {         what = 0;         arg1 = 0;         arg2 = 0;         obj = null;         replyTo = null;         when = 0;         target = null;         callback = null;         data = null;     } }
相關文章
相關標籤/搜索