首页 > 代码库 > 设计模式 -- 亨元模式(FlyWeight Pattern)
设计模式 -- 亨元模式(FlyWeight Pattern)
用来尽可能减少内存使用量,适用于存在大量重复对象的场景,达到对象共享,避免创建过多对象的效果,提升性能,避免内存溢出。
定义:
使用共享对象有效支持大量细粒度对象。
适用场景:
- 系统中存在大量相似对象;
- 细粒度对象具备接近外部状态,内部状态与环境无关;
- 需要缓冲池。
亨元模式其实是通过集合来缓冲对象,获取的时候,先判断集合里面是否存在该对象,如果有就取出来,没有创建新的,避免不必要的对象创建。
简单例子:
接口类:
public interface Ticket { public void showTicketInfo(String bunk);}
接口实现类:
public class AirTicket implements Ticket { public String from; public String to; public String bunk; public int price; public AirTicket(String from, String to) { this.from = from; this.to = to; } @Override public void showTicketInfo(String bunk) { price = new Random().nextInt(300); System.out.println("从" + from + "到" + to + "的" + bunk + "价格:" + price); }}
亨元工厂类,创建对象池,创建亨元对象:
public class AirTicketFactory { public static Map<String, Ticket> tickets = new ConcurrentHashMap<String, Ticket>(); /** * 亨元模式具体体现,缓冲对象数据,减少对象创建 * @param from * @param to * @return */ public static Ticket getTicket(String from, String to) { String key = from + "-" + to; if (tickets.containsKey(key)) { return tickets.get(key); }else { AirTicket airTicket = new AirTicket(from, to); tickets.put(key, airTicket); return airTicket; } }}
测试类:
public class Main { public static void main(String[] args) { Ticket toXianAirTicket0 = AirTicketFactory.getTicket("深圳", "西安"); Ticket toBeiJingAirTicket = AirTicketFactory.getTicket("深圳", "北京"); Ticket toXianAirTicket1 = AirTicketFactory.getTicket("深圳", "西安"); Ticket toXianAirTicket2 = AirTicketFactory.getTicket("深圳", "西安"); toXianAirTicket0.showTicketInfo("头等舱"); toBeiJingAirTicket.showTicketInfo("商务舱"); toXianAirTicket1.showTicketInfo("头等舱"); toXianAirTicket2.showTicketInfo("头等舱"); }}
结果:
从深圳到西安的头等舱价格:114从深圳到北京的商务舱价格:215从深圳到西安的头等舱价格:231从深圳到西安的头等舱价格:103
设计模式 -- 亨元模式(FlyWeight Pattern)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。