定义
对象池的一种实现,对象池可以避免不停的创建对象和销毁多个对象,消耗性能
共享细粒度对象,将多个对同一对象的访问集中起来
适用场景
- 系统底层开发,解决系统系统性能问题
- 系统有大量相似对象,需要缓冲池的场景
享元模式实例
public interface Ticket {
void showInfo(String bunk);
}
public class TrainTicket implements Ticket {
private String from;
private String to;
private int price;
public void setFrom(String from) {
this.from = from;
}
public void setTo(String to) {
this.to = to;
}
public TrainTicket(String from, String to) {
this.from = from;
this.to = to;
}
@Override
public void showInfo(String bunk) {
this.price = new Random().nextInt(500);
System.out.println(from + "->" + to + ":" + bunk + "价格:" + this.price);
}
}
// 配合工厂模式使用,注重资源的重复使用
public class TicketFactory {
public static Map<String,Ticket> pool = new HashMap<String, Ticket>();
public static Ticket queryTicket(String from, String to) {
String key = from + "->" + to;
if (pool.containsKey(key)) {
System.out.println("使用缓存" + key);
return pool.get(key);
}
System.out.println("首次使用对象:" + key);
Ticket ticket =new TrainTicket(from,to);
pool.put(key,ticket);
return ticket;
}
public static void main(String[] args) {
Ticket ticket = TicketFactory.queryTicket("南通","上海");
ticket.showInfo("硬座");
ticket = TicketFactory.queryTicket("南通","上海");
ticket.showInfo("软座");
ticket = TicketFactory.queryTicket("南通","海南");
ticket.showInfo("卧铺");
ticket = TicketFactory.queryTicket("南通","海南");
ticket.showInfo("硬座");
}
}
与其他设计模式区别
- 代理
- 享元模式使一对多,注重资源的重复利用
- 代理是一对一,注重增强
- 配合工厂模式使用
- 使用单例创建,避免多个对象的创建
应用
- String
- Integer 超过127进入cache模式
- LongCache
- ObjectPool
优点
- 减少对象的创建,降低内存的使用,提高效率,减少内存之外的其他资源的使用
缺点
- 关注内外部状态,关注线程安全
- 系统程序的逻辑复杂化
特点
- 内部
- 不随环境的改变而改变
- 外部
- 可以有多种状态,随环境的改变而改变,比如是否被回收,是否正在使用等等
享元模式是一种用于性能优化的设计模式,通过共享细粒度对象来减少内存消耗和提高效率。在系统底层开发中,当存在大量相似对象时,享元模式能避免频繁的对象创建和销毁。例如,在火车票预订系统中,享元工厂可以缓存已存在的票务信息,避免重复创建。这种模式与代理模式不同,代理关注一对一的增强,而享元关注资源复用。应用享元模式可能需要关注线程安全和内外部状态的管理,但能有效减少内存使用和提高系统性能。
1295

被折叠的 条评论
为什么被折叠?



