结构型模式-享元模式
享元模式
享元模式是池技术的重要实现方式,使用共享技术有效的支持大量细粒度的对象。常见的有数据库连接池、String常量池等。
举个例子:用户去查看火车票的信息,信息都有起始站、目的站、价格等。如果多个用户在查看同一个起始、目的站时都会创建一个对象,这样的对象就会创建很多重复的,我们可以将可以共享的信息保存起来,在查看的时候从缓存里取。
抽象享元角色-显示火车票信息
public abstract class ITicket {
abstract void showTicketInfo();
}
具体享元角色-火车票信息
public class TicketInfo extends ITicket{
private String from;
private String to;
private Integer price;
public TicketInfo(String from, String to, Integer price) {
this.from = from;
this.to = to;
this.price = price;
}
@Override
void showTicketInfo() {
System.out.println("起始站:"+this.from+",终点站:"+this.to+",价格:"+this.price);
}
}
享元工厂
public class TicketInfoFactory {
private HashMap<String, TicketInfo> pool = new HashMap<>();
public TicketInfo getTicketInfo(String from, String to){
String key = from+"->"+to;
if(!pool.containsKey(key)){
Random random = new Random();
int i = random.nextInt(500);
pool.put(key,new TicketInfo(from, to,i));
}
return pool.get(key);
}
}
测试
public class Main {
public static void main(String[] args) {
TicketInfoFactory factory = new TicketInfoFactory();
TicketInfo ticketInfo = factory.getTicketInfo("西安", "营口");
ticketInfo.showTicketInfo();
}
}
享元模式优点:
- 减少重复对象的创建,降低程序内存的占用
享元模式缺点:
- 提高了系统复杂性
适用场景:
- 存在大量相似的对象
- 需要使用缓冲池