1. 程式人生 > 實用技巧 >mysql基礎之增刪改查

mysql基礎之增刪改查

享元模式

一、簡介

享元模式是物件池的一種實現,它用來儘可能減少記憶體使用量,適合可能存在大量重複物件的場景,快取可共享的物件避免建立過多物件。

享元物件中的部分狀態是可共享稱之為內部狀態,內部狀態不會隨環境變化。不可共享的狀態稱之為外部狀態,會隨環境改變而變化。在享元模式中建立一個物件容器它的鍵是享元物件的內部狀態,值是享元物件本身。客戶端通過內部狀態從享元工廠中獲取享元物件,如果有快取則直接返回快取否則建立新物件存入容器中然後返回。

定義:使用共享物件可有效地支援大量的細粒度的物件

二、使用場景

  • 存在大量相似物件時
  • 細粒度的物件都具備較接近的外部狀態而且內部狀態與環境無關,也就是說物件沒有特定身份
  • 需要緩衝池的場景

三、簡單實現

以查詢火車票資訊為例,我們在查詢某輛火車的車票時會向服務端傳送請求,這裡的“請求”如果每到一個服務端就建立一個新的使用完成後銷燬,這樣做會使得大量重複物件建立銷燬頻繁GC。如果把請求快取起來則會減少很多記憶體佔用。

    public interface Ticket{
        void showTicketInfo();
    }

    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() {
            price=new Random().nextInt(100);
            Log.i(TAG, "showTicketInfo: form "+from+" to "+to+" bunk "+bunk+"  price "+price);
        }
    }
    
    public class TicketFactory{
     Map<String,Ticket> map=new ConcurrentHashMap<>();
        
     public  Ticket getTicket(String form,String to){
         String key=form+"-"+to;
         if (map.containsKey(key)){
             Log.i(TAG, "getTicket: cached");
             return map.get(key);
         }else {
             Log.i(TAG, "getTicket: create");
             Ticket ticket=new TrainTicket(form,to);
             map.put(key,ticket);
             return ticket;
         }
     }
        
    }
    
    public void Test(){
        TicketFactory ticketFactory=new TicketFactory();
        Ticket ticket1=ticketFactory.getTicket("北京","天津");
        ticket1.showTicketInfo();

        Ticket ticket2=ticketFactory.getTicket("北京","天津");
        ticket2.showTicketInfo();

        Ticket ticket3=ticketFactory.getTicket("北京","天津");
        ticket3.showTicketInfo();
    }

四、小結

在Android中Handler機制中使用的Message內部就採用了享元模式,Message內部有一個訊息快取池當我們需要一個Message時可以通過Message.obtain來獲取一個Message。當緩衝池為空時則會建立Message然後當Message不在使用時回收至緩衝池中。

享元模式可以大大減少物件的建立,降低記憶體佔用,但是它需要分離出外部狀態和內部狀態,且外部狀態具有固話特性。

該模式的優勢就是大幅降低記憶體中物件的數量,但是相對應的它使系統更加複雜。