《Android源码设计模式》读书笔记 (22) 第22章 享元模式

前言

  • 享元模式是对象池的一种实现,Flyweight,代表轻量级的意思.
  • 享元模式适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享,避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除等

正文

  • 定义:使用共享对象可有效地支持大量的细粒度的对象
  • 使用场景:
    1.系统中存在大量的相似对象.
    2.细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定的身份.
    3.需要缓冲池的场景
  • 优点:
    1.享元模式的优点在于它大幅度地降低内存中对象的数量.但是,它做到这一点所付出的代价也是很高的.
    2.享元模式使得系统更加复杂,为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化.
    3.享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长.

UML类图

这里写图片描述

  • Flyweight:享元对象的抽象基类或者接口.
  • ConcreteFlyweight:具体的享元对象
  • FlyweightFactory:享元工厂,负责管理享元对象池和创建享元对象.

案例

  • 我觉得享元模式,就是一种使用缓存池的思想,避免生成过多的类对象,造成OOM.书上提供了一个10000人同时购买车票的案例,这里直接贴代码,大概感受下吧.
/**
 * Flyweight接口:享元对象的抽象基类或者接口
 * Created by max on 2016/4/13.
 */
public interface Ticket {
    /**
     * 我们的业务就是查询车票结果
     * @param bunk
     */
    public void showTicketInfo(String bunk);
}
/**
 * 具体的享元对象:
 * Created by max on 2016/4/13.
 */
public 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) {
        //通过构造函数,传递from,to生成查询结果,具体就不写了
    }
}
/**
 * 享元工厂,负责管理享元对象池和创建享元对象.
 * Created by max on 2016/4/13.
 */
public class TicketFactory {
    static Map<String,TrainTicket> sTicketMap = new HashMap<>();

    public static Ticket getTicket(String from,String to){
        String key = from + "-" + to;
        if (sTicketMap.containsKey(key)){
            return sTicketMap.get(key);
        }else{
            Ticket ticket = new TrainTicket(from,to);
            sTicketMap.put(key, (TrainTicket) ticket);
            return ticket;
        }
    }
}
/**
 * 客户端调用,使用缓存池,避免生成大量的对象
 * Created by max on 2016/4/13.
 */
public class Client {
    public static void main(String[] args){
        Ticket ticket = TicketFactory.getTicket("深圳","成都");
        ticket.showTicketInfo("上下铺");
    }
}

总结

  • 其实文章中,我觉得讲android中享元模式的应用这块写的挺好,主要是引用android消息机制来讲的,建议配合源码多看看
  • 案例demo下载.
发布了82 篇原创文章 · 获赞 3 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章