设计模式 -- 亨元模式(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
原文地址:https://www.cnblogs.com/androidsuperman/p/5860804.html