美文网首页Android设计模式
Android设计模式-21-享元模式

Android设计模式-21-享元模式

作者: 今阳说 | 来源:发表于2018-06-20 19:52 被阅读50次

1. 定义

  • 运用共享技术有效的支持大量细粒度的对象

2. 使用场景

  1. 系统中存在大量的相似对象
  2. 细粒度的对象都具备较接近的外部状态,而内部状态与环境无关,也就是说对象没有特定身份
  3. 需要缓冲池的场景

3. 优缺点

  • 优点:
    大幅度降低内存中对象的数量,提升性能减少内存
  • 缺点:
    为了使对象可以共享,需要将一些状态外部化,使得程序逻辑复杂化,而且读取外部状态使得运行时间稍微变长

4. Android源码中的使用

我们平时使用的Handler中的getPostMessage所得到的message对象就是通过享元模式创建的, 可以看下如下代码:

  //使用Handler
  handler.post(new Runnable() {
     @Override
     public void run() {
         mTextViewShow.append("\nThread中new Handler(Looper.getMainLooper()) 更新UI");
     }
  });
  //源码:
  public final boolean post(Runnable r) {
        return sendMessageDelayed(getPostMessage(r), 0);
    }

    private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;
        return m;
    }

    // 可以看到Message对象并不是通过new去大量构建的,而是通过一个默认大小为50的对象池
    public static Message obtain() {
        synchronized (sPoolSync) {
            if (sPool != null) {
                Message m = sPool;
                sPool = m.next;
                m.next = null;
                m.flags = 0; // clear in-use flag
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }

5. 实例演示

以购买火车票为例

  1. 创建一个车票接口
  public interface Ticket {
        //展示车票信息的函数
        void showTicketInfo(String bunk);
    }
  1. 创建一个实现类-火车票
  //火车票
    public static class TrainTicket implements Ticket {
        public String from;//始发地
        public String to;//目的地
        public String bunk;//铺位
        public int price;//价格

        public TrainTicket(String from, String to) {
            this.from = from;
            this.to = to;
        }

        @Override
        public void showTicketInfo(String bunk) {
            this.bunk = bunk;
            price = new Random().nextInt(500);
            LjyLogUtil.i("购买 从 " + from + " 到 " + to + " 的 " + bunk + " " +
                    "火车票" + ", 价格: " + price);
        }

    }
  1. 创建车票的工厂类,使用享元模式
  public static class TicketFactory {
        static Map<String, Ticket> sTicketMap = new HashMap<>();

        public static Ticket getTicket(String from, String to) {
            //1.普通写法: 每次都new会消耗资源和内存,甚至导致OOM
//            return new TrainTicket(from, to);
            //2.享元模式
            String key = from + "-" + to;
            if (sTicketMap.containsKey(key)) {
                LjyLogUtil.i("使用缓存==> " + key);
                return sTicketMap.get(key);
            } else {
                LjyLogUtil.i("创建对象==> " + key);
                Ticket ticket = new TrainTicket(from, to);
                sTicketMap.put(key, ticket);
                return ticket;
            }

        }
    }
  1. 使用享元创建实例
  private void methodFlyweightPattern() {
        //以购买火车票为例
        Ticket ticket1 = TicketFactory.getTicket("北京", "廊坊");
        ticket1.showTicketInfo("软座");
        Ticket ticket2 = TicketFactory.getTicket("北京", "云南");
        ticket2.showTicketInfo("上铺");
        Ticket ticket3 = TicketFactory.getTicket("北京", "廊坊");
        ticket3.showTicketInfo("站票");
    }

相关文章

  • Android 享元模式

    Android 设计模式系列文章 Android 23种设计模式 一、前言 享元模式即:Flyweight,它是对...

  • Android设计模式-21-享元模式

    1. 定义 运用共享技术有效的支持大量细粒度的对象 2. 使用场景 系统中存在大量的相似对象 细粒度的对象都具备较...

  • Android设计模式-21-享元模式

    1. 定义 运用共享技术有效的支持大量细粒度的对象 2. 使用场景 系统中存在大量的相似对象 细粒度的对象都具备较...

  • 好程序员Java培训​分享java设计模式之享元模式

    好程序员Java培训​分享java设计模式之享元模式,Java设计模式中的享元模式。享元模式有点类似于单例...

  • 享元模式

    Android进阶之设计模式 享元模式 定义: 使用共享对象有效地支持大量细粒度的对象. 享元模式是池技术的重要实...

  • Java设计模式——享元模式

    Java设计模式之享元模式 这期跟大家聊的的设计模式是享元模式,该模式也是结构模式。 简介 利用共享的方式解决大量...

  • Java设计模式_享元模式

    点击链接跳转:设计模式——享元模式

  • Android设计模式-享元模式

    UML关系简单介绍UML简单使用的介绍创建型设计模式Android设计模式-单例模式Android设计模式-工厂模...

  • Android 设计模式 - 享元模式

    简介 享元模式是对象池的一种实现,它的英文名叫Flyweight, 代表轻量级的意思。享元模式用来尽可能减少内存使...

  • 二十一、享元模式

    1. 何为享元模式 定义:通过共享已存在的对象,减少创建对象内存开销的设计模式被称为享元模式。 享元模式和单例模式...

网友评论

    本文标题:Android设计模式-21-享元模式

    本文链接:https://www.haomeiwen.com/subject/axaxyftx.html