享元模式(结构型)

享元模式是一种用于性能优化的设计模式,通过共享细粒度对象来减少内存消耗和提高效率。在系统底层开发中,当存在大量相似对象时,享元模式能避免频繁的对象创建和销毁。例如,在火车票预订系统中,享元工厂可以缓存已存在的票务信息,避免重复创建。这种模式与代理模式不同,代理关注一对一的增强,而享元关注资源复用。应用享元模式可能需要关注线程安全和内外部状态的管理,但能有效减少内存使用和提高系统性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

对象池的一种实现,对象池可以避免不停的创建对象和销毁多个对象,消耗性能

共享细粒度对象,将多个对同一对象的访问集中起来

适用场景

  1. 系统底层开发,解决系统系统性能问题
  2. 系统有大量相似对象,需要缓冲池的场景

享元模式实例

public interface Ticket {
    void showInfo(String bunk);
}

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

    public void setFrom(String from) {
        this.from = from;
    }

    public void setTo(String to) {
        this.to = to;
    }

    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(from + "->" + to + ":" + bunk + "价格:" + this.price);
    }
}

// 配合工厂模式使用,注重资源的重复使用
public class TicketFactory {
    public static Map<String,Ticket> pool = new HashMap<String, Ticket>();

    public static Ticket queryTicket(String from, String to) {
        String key = from + "->" + to;
        if (pool.containsKey(key)) {
            System.out.println("使用缓存" + key);
            return pool.get(key);
        }
        System.out.println("首次使用对象:" + key);
        Ticket ticket  =new TrainTicket(from,to);
        pool.put(key,ticket);
        return ticket;
    }

    public static void main(String[] args) {
        Ticket ticket = TicketFactory.queryTicket("南通","上海");
        ticket.showInfo("硬座");
        ticket = TicketFactory.queryTicket("南通","上海");
        ticket.showInfo("软座");
        ticket = TicketFactory.queryTicket("南通","海南");
        ticket.showInfo("卧铺");
        ticket = TicketFactory.queryTicket("南通","海南");
        ticket.showInfo("硬座");
    }
}

与其他设计模式区别

  1. 代理
    1. 享元模式使一对多,注重资源的重复利用
    2. 代理是一对一,注重增强
  2. 配合工厂模式使用
  3. 使用单例创建,避免多个对象的创建

应用

  1. String
  2. Integer 超过127进入cache模式
  3. LongCache
  4. ObjectPool

优点

  1. 减少对象的创建,降低内存的使用,提高效率,减少内存之外的其他资源的使用

缺点

  1. 关注内外部状态,关注线程安全
  2. 系统程序的逻辑复杂化

特点

  1. 内部
    1. 不随环境的改变而改变
  2. 外部
    1. 可以有多种状态,随环境的改变而改变,比如是否被回收,是否正在使用等等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值