import java.util.Map; import java.util.Random; import java.util.concurrent.ConcurrentHashMap; /** * 享元模式: 面向對象技術能夠很好的解決一些靈活性或可擴展性問題, 可是在不少狀況下須要在系統中增長類和對象的個數, 可是當這些徹底同樣的對象數量太多的時候, 會致使運行的代價太高, 帶來性能降低等問題. * 享元模式正是爲了該問題而誕生. * 享元模式是對象池的一種實現, 相似於線程池, 數據庫鏈接池, 他們均可以免不停的建立和銷燬帶來的高額代價. 享元模式是爲了減小內存使用, 避免出現大量重複的建立和銷燬對象的場景. * 享元模式的老是是共享細粒度獨享, 將多個同一對象的訪問集中起來, 沒必要爲每一個訪問者建立一個單獨的對象, 以此下降內存消耗. */ class Client { public static void main(String[] args) { ITicket ticket = TicketFactory.queryTicket("深圳北", "潮汕"); ticket.showInfo("硬座"); ticket = TicketFactory.queryTicket("深圳北", "潮汕"); ticket.showInfo("軟座"); ticket = TicketFactory.queryTicket("深圳北", "潮汕"); ticket.showInfo("硬臥"); } interface ITicket { void showInfo(String bunk); } static class TrainTicket implements ITicket { private String from; private String to; private int price; public TrainTicket(String from, String to) { this.from = from; this.to = to; } @Override public void showInfo(String bunk) { this.price = new Random().nextInt(500); System.out.println(String.format("%s->%s:%s價格:%s 元", this.from, this.to, bunk, this.price)); } } static class TicketFactory { private static Map<String, ITicket> sTicketPool = new ConcurrentHashMap<>(); public static ITicket queryTicket(String from, String to) { String key = from + "->" + to; if (TicketFactory.sTicketPool.containsKey(key)) { System.out.println("使用緩存 ==> " + key); return TicketFactory.sTicketPool.get(key); } System.out.println("第一次查詢,建立對象 ==> " + key); ITicket ticket = new TrainTicket(from, to); TicketFactory.sTicketPool.put(key, ticket); return ticket; } } }