定義
運用共享技術有效地支持大量細粒度對象费韭。
相關的名稱定義
- 內部狀態(tài):可以共享的狀態(tài),不會隨著環(huán)境的變化而變化。
- 外包狀態(tài):不可以共享的狀態(tài),會隨著環(huán)境的變化而變化
- 享元工廠:創(chuàng)建享元對象的工廠驾诈。判斷對象是否存在戳葵,若存在直接返回,不存在則創(chuàng)建新的對象并返回。通常是一個Map來保存,鍵為內部狀態(tài)。
享元模式的使用場景
- 系統(tǒng)中存在大量的相似對象
- 細粒度對象具備較相近的外部狀態(tài)绿店,也就是說對象沒有特定身份转培。
- 需要緩沖池的場景
享元模式的優(yōu)缺點
優(yōu)點:
- 盡可能減少內存的使用
- 提高性能羽戒、避免內存移除
缺點:
- 使得系統(tǒng)更加復雜
- 讀取外部狀態(tài)時間加長
享元模式實例
享元模式實例.png
調用流程.png
目錄結構.png
- Ticket
public interface Ticket {
void showTicketInfo();
}
- TrainTicket
public class TrainTicket implements Ticket {
private String from;
private String to;
private int price;
public TrainTicket(String from, String to) {
this.from = from;
this.to = to;
}
@Override
public void showTicketInfo() {
this.price = new Random().nextInt(100);
System.out.println("從 " + from + " 開往 " + to + " 的列車份乒,票價為:" + price);
}
}
- TicketFactory
public class TicketFactory {
private Map<String, Ticket> mTickets = new HashMap<String, Ticket>();
public Ticket getTicket(String from, String to) {
String key = from + "-" + to;
if (mTickets.containsKey(key)) {
Ticket ticket = mTickets.get(key);
return ticket;
}
TrainTicket ticket = new TrainTicket(from, to);
mTickets.put(key, ticket);
return ticket;
}
public int getHoldTicketCount(){
return mTickets.size();
}
}
- Client
public class Client {
public static void main(String[] args) {
TicketFactory ticketFactory = new TicketFactory();
Ticket ticket1 = ticketFactory.getTicket("深圳", "北京");
ticket1.showTicketInfo();
Ticket ticket2 = ticketFactory.getTicket("海口", "廣州");
ticket2.showTicketInfo();
Ticket ticket3 = ticketFactory.getTicket("海口", "廣州");
ticket3.showTicketInfo();
System.out.println("持有ticket實例數(shù):"+ticketFactory.getHoldTicketCount());
}
}
參考:
- 《大話設計模式》
- 《android源碼設計模式》