最近在繼續iPhone
業務的同時還須要從新拾起Android
。在有些生疏的狀況下,決定從Android
源碼中感悟一些Android
的風格和方式。在學習源碼的過程當中也發現了一些通用的模式,但願經過一個系列的文章總結和分享下。
享元模式是一種針對大量細粒度對象有效使用的一種模式。Android中的Message、Parcel和TypedArray都利用了享元模式。以Message爲例,類圖以下:
其中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; } }