定义
运用共享技术有效地支持大量的细粒度对象。
本质
分离与共享
登场角色
-
FlyWeight(轻量级)
享元对象抽象基类或者接口。FlyWeight实例表示的就是那些实例会被共享的类。
-
ConcreteFlyWeight(具体的享元对象)
-
FlyWeightFactory(享元工厂)
负责创建享元对象池和管理享元对象。
示例代码
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;
public TrainTicket(String from, String to) {
this.from = from;
this.to = to;
}
@Override
public void showTicketInfo(String bunk) {
price = new Random().nextInt(100);
System.out.println("购买从" + from + "到" + to + "的" + bunk + " 火车票,价格为: " + price);
}
}
public class TicketFactory {
static Map<String,Ticket> stringTicketMap = new ConcurrentHashMap<>();
public static Ticket getTicket(String from,String to){
String key = from + "-" + to;
if(stringTicketMap.containsKey(key)){
System.out.println("使用缓存");
return stringTicketMap.get(key);
}else{
System.out.println("创建对象");
Ticket ticket = new TrainTicket(from,to);
stringTicketMap.put(key,ticket);
return ticket;
}
}
}
public class Main {
public static void main(String[] args){
Ticket ticket1 = TicketFactory.getTicket("北京","上海");
ticket1.showTicketInfo("上铺");
Ticket ticket2 = TicketFactory.getTicket("北京","上海");
ticket2.showTicketInfo("下铺");
Ticket ticket3 = TicketFactory.getTicket("北京","青岛");
ticket3.showTicketInfo("坐铺");
}
}
运行结果
创建对象
购买从北京到上海的上铺 火车票,价格为: 17
使用缓存
购买从北京到上海的下铺 火车票,价格为: 35
创建对象
购买从北京到青岛的坐铺 火车票,价格为: 12
优点
- 减少对象数量,节省内存空间。
缺点
- 维护共享对象,需要额外的开销。
使用场景
-
如果一个应用程序中使用了大量的细粒度对象,可以使用享元模式来减少对象数量。
-
如果由于使用大量的对象,造成了很大的存储开销,可以使用享元模式来减少对象数量,并节约内存。
网友评论