mysql基礎之增刪改查
阿新 • • 發佈:2020-10-14
享元模式
一、簡介
享元模式是物件池的一種實現,它用來儘可能減少記憶體使用量,適合可能存在大量重複物件的場景,快取可共享的物件避免建立過多物件。
享元物件中的部分狀態是可共享稱之為內部狀態,內部狀態不會隨環境變化。不可共享的狀態稱之為外部狀態,會隨環境改變而變化。在享元模式中建立一個物件容器它的鍵是享元物件的內部狀態,值是享元物件本身。客戶端通過內部狀態從享元工廠中獲取享元物件,如果有快取則直接返回快取否則建立新物件存入容器中然後返回。
定義:使用共享物件可有效地支援大量的細粒度的物件
二、使用場景
- 存在大量相似物件時
- 細粒度的物件都具備較接近的外部狀態而且內部狀態與環境無關,也就是說物件沒有特定身份
- 需要緩衝池的場景
三、簡單實現
以查詢火車票資訊為例,我們在查詢某輛火車的車票時會向服務端傳送請求,這裡的“請求”如果每到一個服務端就建立一個新的使用完成後銷燬,這樣做會使得大量重複物件建立銷燬頻繁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不在使用時回收至緩衝池中。
享元模式可以大大減少物件的建立,降低記憶體佔用,但是它需要分離出外部狀態和內部狀態,且外部狀態具有固話特性。
該模式的優勢就是大幅降低記憶體中物件的數量,但是相對應的它使系統更加複雜。