用來盡可能減少內存使用量,適用于存在大量重復對象的場景,達到對象共享,避免創建過多對象的效果,提升性能,避免內存溢出。
定義:
使用共享對象有效支持大量細粒度對象。
適用場景:
- 系統中存在大量相似對象;
- 細粒度對象具備接近外部狀態,內部狀態與環境無關;
- 需要緩沖池。
亨元模式其實是通過集合來緩沖對象,獲取的時候,先判斷集合里面是否存在該對象,如果有就取出來,沒有創建新的,避免不必要的對象創建。
簡單例子:
接口類:
public interface Ticket {public void showTicketInfo(String bunk); }
接口實現類:
public class AirTicket implements Ticket {public String from;public String to;public String bunk;public int price;public AirTicket(String from, String to) {this.from = from;this.to = to;}@Overridepublic void showTicketInfo(String bunk) {price = new Random().nextInt(300);System.out.println("從" + from + "到" + to + "的" + bunk + "價格:" + price);} }
亨元工廠類,創建對象池,創建亨元對象:
public class AirTicketFactory {public static Map<String, Ticket> tickets = new ConcurrentHashMap<String, Ticket>();/*** 亨元模式具體體現,緩沖對象數據,減少對象創建* @param from* @param to* @return*/public static Ticket getTicket(String from, String to) {String key = from + "-" + to;if (tickets.containsKey(key)) {return tickets.get(key);}else {AirTicket airTicket = new AirTicket(from, to);tickets.put(key, airTicket);return airTicket;}} }
測試類:
public class Main {public static void main(String[] args) {Ticket toXianAirTicket0 = AirTicketFactory.getTicket("深圳", "西安");Ticket toBeiJingAirTicket = AirTicketFactory.getTicket("深圳", "北京");Ticket toXianAirTicket1 = AirTicketFactory.getTicket("深圳", "西安");Ticket toXianAirTicket2 = AirTicketFactory.getTicket("深圳", "西安");toXianAirTicket0.showTicketInfo("頭等艙");toBeiJingAirTicket.showTicketInfo("商務艙");toXianAirTicket1.showTicketInfo("頭等艙");toXianAirTicket2.showTicketInfo("頭等艙");} }
結果:
從深圳到西安的頭等艙價格:114 從深圳到北京的商務艙價格:215 從深圳到西安的頭等艙價格:231 從深圳到西安的頭等艙價格:103
?