概念
适用于可能存在大量重复对象的场景,通过缓存可共享对象,达到对象共享,避免创建过多对象。享元对象中的字段可分为部分:内部状态(不随环境变化,可共享);外部状态(随环境变化,不可共享)。一般在享元模式中会建立一个对象容器Map即享元工厂,以内部状态为key,值为享元对象本身,客户端通过享元工厂获取享元对象,若工厂缓存了则使用,没有再新建并存入容器中。虽然复杂化系统,但有效优化内存。
应用场景
String常量池、数据库连接池、缓冲池等等都是享元模式的应用
实现方式
以卖火车票为例子,火车票就是享元对象,内部状态便是从固定时间出发到固定时间。
public interface Ticket {
public void showTicketInfo(String bunk); //铺位
}
public class TrainTicket implements Ticket {
public String from;
public String to;
public String bunk;
public int price;
TrainTicket (String from, String to){
this.from = from;
this.to = to;
}
@Override
public void showTicketInfo(String bunk){
System.out.println(100);
}
}
public class TicketFactory {
static Map<>String ,Ticket> map = new ConcurrentHashMap();
public static Ticket getTicket(String from, String to){
String key = from + "-" + to;
if(map.containsKey(key)){
return map.get(key);
} else {
Ticket t = new TrainTicket(from,to);
map.put(key,t);
return t;
}
}
}