zoukankan      html  css  js  c++  java
  • 设计模式 -- 亨元模式(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
  • 相关阅读:
    MSSQL经典语句
    注销时关闭当前窗体,返回登入界面
    自定义控件小结进阶篇
    精妙SQL语句大全
    触发器MSSQL常用操作
    经典SQL语句大全
    文件下载
    android Notification 的使用
    startActivityForResult()的用法
    Android手机中获取手机号码和运营商信息
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/5860804.html
Copyright © 2011-2022 走看看