享元模式

398 阅读1分钟

概念

适用于可能存在大量重复对象的场景,通过缓存可共享对象,达到对象共享,避免创建过多对象。享元对象中的字段可分为部分:内部状态(不随环境变化,可共享);外部状态(随环境变化,不可共享)。一般在享元模式中会建立一个对象容器Map即享元工厂,以内部状态为key,值为享元对象本身,客户端通过享元工厂获取享元对象,若工厂缓存了则使用,没有再新建并存入容器中。虽然复杂化系统,但有效优化内存。

应用场景

String常量池、数据库连接池、缓冲池等等都是享元模式的应用

实现方式

以卖火车票为例子,火车票就是享元对象,内部状态便是从固定时间出发到固定时间。

public interface Ticket {
    public void showTicketInfo(String bunk); //铺位
}

public class TrainTicket implements Ticket {
    public String from;
    public String to;
    public String bunk;
    public int price;

    TrainTicket (String from, String to){
        this.from = from;
        this.to = to;
    }
    @Override
    public void showTicketInfo(String bunk){
        System.out.println(100);
    }
}

public class TicketFactory {
    static Map<>String ,Ticket> map = new ConcurrentHashMap();
    public static Ticket getTicket(String from, String to){
        String key = from + "-" + to;
        if(map.containsKey(key)){
            return map.get(key);
        } else {
            Ticket t = new TrainTicket(from,to);
            map.put(key,t);
            return t;
        }
    }
}