享元模式

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;
        }
    }
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息