1.定义
它是对象池的一种实现。享元模式用来尽可能的减少内存的使用量。多用于存在大量重复对象的场景,或需要缓冲池的时候。用来缓存共享的对象。这样来避免内存溢出等。
举例
定义巴士车票
public interface Ticket {
public void showTicketInfo(String type);
}
public class BusTicket implements Ticket{
private static final String TAG = BusTicket.class.getSimpleName();
String from;
String to;
int price;
BusTicket(String from,String to) {
this.from = from;
this.to = to;
}
@Override
public void showTicketInfo(String type) {
price = new Random().nextInt(100);
Log.d(TAG,from + "到" + to + "的" + type + "巴士票价位" + price);
}
}
//加入不用享元模式直接调用
public class TicketFactory {
public static Ticket getTicket(String from,String to) {
return new BusTicket(from,to);
}
}
Ticket ticket = TicketFactory.getTicket("weihai","beijing");
ticket.showTicketInfo("硬座");
看似没毛病,客户端这样调用查询就可以了。普通情况下这样确实没有问题,但当有大量客户同时查询的时候就可能会OOM了。因为我们会创建大量的相同对象,十分耗内存。当java的GC对这些对象回收的时候同样也属于资源浪费。这时候,该享元模式登场的时候了。我们只需要修改一下Factory。
public class TicketFactory {
static Map<String,Ticket> sTicketMap = new ConcurrentHashMap<String,Ticket>();
public static Ticket getTicket(String from,String to) {
String key = from + "-" + to;
if (sTicketMap.containsKey(key)) {
return sTicketMap.get(key);
} else {
Ticket ticket = new BusTicket(from,to);
sTicketMap.put(key,ticket);
return ticket;
}
}
}
写在最后
享元模式实现起来还是比较简单。在需要大量重复对象的时候起到重要作用。也用作缓存池等场景。能够降低内存中对象的数量。