1、享元模式介绍:
享元模式是对象池的一种实现, 它的英文名叫Flyweight, 代表轻量级的意思 享元模式用来尽可能减少内存使用量, 它适合用于可能存在大量重复对象的场景, 来缓存可共享的对象, 达到对象共享, 避免创建过多对象的效果, 这样一来就可以提升性能, 避免内存移除等;
享元对象中的部分状态是可以共享, 可以共享的状态成为内部状态, 内部状态不会随着环境变化; 不可共享的状态则称之为外部状态, 它们会随着环境的改变而改变. 在享元模式中会建立一个对象容器, 在经典的享元模式中该容器为一个Map, 它的键是享元对象的内部状态, 他的值就是享元对象本身. 客户端程序通过这个内部状态从享元工厂中获取享元对象, 如果有缓存则使用缓存对象, 否则创建一个享元对象并且存入容器中, 这样一来就避免了创建过多对象的问题;
2、享元模式定义:
使用共享对象可有效地支持大量的细粒度的对象;
3、享元模式的使用场景:
1、系统中存在大量的的相似对象;
2、细粒度的对象都具备较接近的外部状态, 而且内部状态与环境无关, 也就是说对象没有特定身份;
3、需要缓冲池的场景;
4、优缺点:
大幅度降低内存中对象的数量, 但是它做到这一点所付出的代价是很高的;
1、享元模式是的系统更加复杂, 为了使对象可以共享, 需要将一些状态外部化, 这使得程序的逻辑复杂化;
2、享元模式将享元对象的状态外部化, 而读取外部状态使得运行时间稍微变长;
5、示例代码:
public interface Ticket {
public void showTicketInfo(String bunk);
}
public class TrainTicket implements Ticket {
public String mFrom;
public String mTo;
public String mBunk;
public int mPrice;
public TrainTicket(String from, String to) {
mFrom = from;
mTo = to;
}
@Override
public void showTicketInfo(String from, String to) {
mPrice = new Random().nextInt(300);
System.out.println("购买从" + mFrom + "到" + mTo + "的" + mBunk + "火车票" + ",价格:" + mPrice);
}
}
public class TicketFactory {
private static Map<String, Ticket> ticketMap = new ConcurrentHashMap<String, Ticket>();
public static Ticket getTicket(String from, String to) {
String key = from + "-" + to;
if (ticketMap.get(key) != null) {
System.out.println("使用缓存 ==> " + key);
return ticketMap.get(key);
} else {
System.out.println("创建对象 ==> " + key);
Ticket ticket = new Ticket(from, to);
ticketMap.put(key, ticket);
return ticket;
}
}
}
网友评论