跳至主要內容

设计模式-结构型-享元模式

引领潮流小于 1 分钟设计模式archive

1、定义

享元模式:通过共享技术来有效支持大量细粒度对象

写法

public interface Ticket {

    void showTicketInfo(String bunk);

}

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(String bunk) {
        price = new Random().nextInt(300);
        System.out.println("购买 从 " + from + " 到 " + to + "的" + bunk + "火车票" + ", 价格:" + price);
    }
}

public class TicketFactory {

    private static Map<String,Ticket> sTicketMap = new ConcurrentHashMap<>(  );

    public static Ticket getTicket(String from ,String to){
        String key = from + "-" + to;
        if(sTicketMap.containsKey(key)){
            System.out.println("使用缓存 ==> " + key);
            return sTicketMap.get(key);
        }else{
            System.out.println("创建对象 ==> " + key);
            Ticket ticket = new TrainTicket(from, to);
            sTicketMap.put(key, ticket);
            return ticket;
        }

    }

}

/**
 *
 * 享元模式
 * eg: message , 线程池,连接池
 * 共享池
 *
 * 大大减少应用程序创建的对象,降低程序内存的占用,增强程序的性能
 *
 */
public class TestMain {

    public static void main(String[] args){

        Ticket ticket01 = TicketFactory.getTicket("北京", "青岛");
        ticket01.showTicketInfo("上铺");

        Ticket ticket02 = TicketFactory.getTicket("北京", "青岛");
        ticket02.showTicketInfo("下铺");

        Ticket ticket03 = TicketFactory.getTicket("北京", "西安");
        ticket03.showTicketInfo("坐票");

    }

}

代码示例

https://github.com/yinlingchaoliu/23-design-pattern