享元模式的基本定义和用法:
在使用handler的时候发现,创建message对象有两种方式,一种是直接new,一种是使用Message.obtain(),这个message的静态方法是这样实现的:
private static final Object sPoolSync = new Object();
private static Message sPool;
private static int sPoolSize = 0;
private static final int MAX_POOL_SIZE = 50;
private static boolean gCheckRecycle = true;
/**
* 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;
m.flags = 0; // clear in-use flag
sPoolSize--;
return m;
}
}
return new Message();
}
从全局池返回一个新的消息实例。取到的话就返回,没有的话就新建一个。允许我们在许多情况下避免分配新对象。就是在复用之前用过的 Message 对象,这里实际上是用到了一种享元设计模式,这种设计模式最大的特点就是复用对象,避免重复创建导致的内存浪费。