《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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章