标签:
享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,用来缓存可共享的对象,达到对象共享、避免创建过多对象的效果。
使用共享对象可有效地支持大量的细粒度对象。
场景如下: 我们现在需要加载图片,如果已经加载过图片了,就直接读取本地缓存,如果没有加载过图片,从网络中保存图片,以图片地址为key。
public interface Pic {
public void showInfo();
}
showInfo方法用来展示图片信息
public class Bitmap implements Pic {
private String src; //图片地址
public Bitmap(String src) {
this.src = src;
}
@Override
public void showInfo() {
System.out.println(src);
}
}
public class BitmapFactory {
private Map<String, Bitmap> imgs = new ConcurrentHashMap<String, Bitmap>();
private Bitmap bitmap;
public Bitmap getBitmap(String src) {
if (imgs.get(src) == null) {
bitmap = new Bitmap(src);
imgs.put(src, bitmap);
System.out.println("加载网络.");
} else {
bitmap = imgs.get(src);
System.out.println("加载本地.");
}
return bitmap;
}
}
如果本地有图片,从本地取出;如果没有图片,联网,存入本地。
public class Client {
public static void main(String[] args) {
BitmapFactory bitmapFactory = new BitmapFactory();
Bitmap bitMap1 = bitmapFactory.getBitmap("图片1");
bitMap1.showInfo();
Bitmap bitMap2 = bitmapFactory.getBitmap("图片2");
bitMap2.showInfo();
Bitmap bitMap1_1 = bitmapFactory.getBitmap("图片1");
bitMap1_1.showInfo();
}
}
结果如下:
加载网络.
图片1
加载网络.
图片2
加载本地.
图片1
可以看到,第一次创建后,第三次取出同样的图片时,加载的是本地图片。
享元模式在Android源码也比较常见,比如ListView的convertView。
在getView时,判断convertView是不是null,如果等于null,才会调用inflate()方法来加载布局,不等于null就直接利用convertView。
convertView是我们之前用过的View,只不过移除了屏幕后进入了废弃的缓存中。当convertView不等于null时,将其重新拿出来使用。
享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享、避免创建过多对象的效果。
标签:
原文地址:http://blog.csdn.net/u010649376/article/details/51355858