美文网首页设计模式
享元模式(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