美文网首页设计模式
享元模式(FlyWeight)

享元模式(FlyWeight)

作者: 秀儿2020 | 来源:发表于2020-07-22 17:25 被阅读0次

定义

运用共享技术有效地支持大量的细粒度对象。

本质

分离与共享

登场角色

  • FlyWeight(轻量级)

    享元对象抽象基类或者接口。FlyWeight实例表示的就是那些实例会被共享的类。

  • ConcreteFlyWeight(具体的享元对象)
  • FlyWeightFactory(享元工厂)

    负责创建享元对象池和管理享元对象。

示例代码

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;

    public TrainTicket(String from, String to) {
        this.from = from;
        this.to = to;
    }

    @Override
    public void showTicketInfo(String bunk) {
        price = new Random().nextInt(100);
        System.out.println("购买从" + from + "到" + to + "的" + bunk + " 火车票,价格为: " + price);
    }
}


public class TicketFactory {
    static Map<String,Ticket> stringTicketMap = new ConcurrentHashMap<>();

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


public class Main {
    public static void main(String[] args){
        Ticket ticket1 = TicketFactory.getTicket("北京","上海");
        ticket1.showTicketInfo("上铺");
        Ticket ticket2 = TicketFactory.getTicket("北京","上海");
        ticket2.showTicketInfo("下铺");
        Ticket ticket3 = TicketFactory.getTicket("北京","青岛");
        ticket3.showTicketInfo("坐铺");
    }
}

运行结果

创建对象
购买从北京到上海的上铺 火车票,价格为: 17
使用缓存
购买从北京到上海的下铺 火车票,价格为: 35
创建对象
购买从北京到青岛的坐铺 火车票,价格为: 12

优点

  • 减少对象数量,节省内存空间。

缺点

  • 维护共享对象,需要额外的开销。

使用场景

  • 如果一个应用程序中使用了大量的细粒度对象,可以使用享元模式来减少对象数量。

  • 如果由于使用大量的对象,造成了很大的存储开销,可以使用享元模式来减少对象数量,并节约内存。

相关文章

网友评论

    本文标题:享元模式(FlyWeight)

    本文链接:https://www.haomeiwen.com/subject/knetlktx.html