首页 > 代码库 > 设计模式 -- 亨元模式(FlyWeight Pattern)

设计模式 -- 亨元模式(FlyWeight Pattern)

用来尽可能减少内存使用量,适用于存在大量重复对象的场景,达到对象共享,避免创建过多对象的效果,提升性能,避免内存溢出。

定义:

使用共享对象有效支持大量细粒度对象。

适用场景:

  1. 系统中存在大量相似对象;
  2. 细粒度对象具备接近外部状态,内部状态与环境无关;
  3. 需要缓冲池。

亨元模式其实是通过集合来缓冲对象,获取的时候,先判断集合里面是否存在该对象,如果有就取出来,没有创建新的,避免不必要的对象创建。

简单例子:

接口类:

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)