美文网首页
享元模式(对象共享,避免创建过多的对象)

享元模式(对象共享,避免创建过多的对象)

作者: 钉某人 | 来源:发表于2017-11-20 10:55 被阅读0次
源码地址 https://github.com/DingMouRen/DesignPattern
享元模式.png
  • Flyweight 享元对象的抽象基类或接口
  • ConcreteFlyweight 具体的享元对象
  • FlywightFactory 享元工厂 负责管理享元对象池和创建享元对象
定义

享元模式使用共享对象有效的支持大量的细粒度的对象。

使用场景
  • 系统中有大量的相似对象
  • 需要缓冲池的场景
举个栗子

春节买火车票,那种并发量是可怕的,对象的数量的也是可怕的,如果每一个请求都会创建一个对象的话,垃圾回收器任务繁重,内存也是居高不下的。这时候适合用享元模式来避免创建过多的对象。从始发地到目的地来表示一张火车票,票还分上、中、下铺位。我们将公用的对象缓存起来,在用户查询时优先使用缓存,如果没有缓存再重新创建。

//抽象的享元类:票
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) {
        this.bunk = bunk;
        price = new Random().nextInt(300);
        System.out.println("火车票从"+from+"到"+to+",铺位:"+bunk+",价格:"+price+"  哈希值:"+this.hashCode());
    }
}

//享元工厂
public class TicketFactory {
  public static Map<String,Ticket> ticketMap = new ConcurrentHashMap<>();

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

使用
    public static void main(String[] args) {
        Ticket ticket1 = TicketFactory.getTicket("济南","杭州");
        ticket1.showTicketInfo("上铺");
        Ticket ticket2 = TicketFactory.getTicket("济南","杭州");
        ticket2.showTicketInfo("中铺");
        Ticket ticket3 = TicketFactory.getTicket("济南","杭州");
        ticket3.showTicketInfo("下铺");
    }
总结

享元模式可以大幅度降低内存中对象的数量,但是使得系统更加复杂。

相关文章

  • 享元模式(对象共享,避免创建过多的对象)

    Flyweight 享元对象的抽象基类或接口 ConcreteFlyweight 具体的享元对象 Flywight...

  • 设计模式知识梳理(6) - 结构型 - 享元模式

    一、基本概念 1.1 定义 使用享元对象可有效地支持大量的细粒度的对象,达到对象共享、避免创建过多对象的效果。 享...

  • 享元模式

    描述 享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。 简介 享元模式采用一个共享来避免...

  • 享元模式

    swift实战-享元模式 概论:通过共享已存在的对象,减少创建对象内存开销的设计模式被称作享元模式 享元模式Fly...

  • 二十一、享元模式

    1. 何为享元模式 定义:通过共享已存在的对象,减少创建对象内存开销的设计模式被称为享元模式。 享元模式和单例模式...

  • Python设计模式 - 共享模式

    """ 共享模式:共享对象,避免内存浪费(避免重复创建相同对象) """ #共享模式 classBorg: """...

  • java设计模式-享元模式(Flyweight)

    享元模式,属于结构性模式。 享元模式,享:共享,分享;元:元件,对象的意思。整体意思就是共享对象。在JVM中,能实...

  • Java设计模式—享元模式

    享元模式采用共享机制来避免大量拥有相同内容对象的开销。这种开销最常见、最直观的就是内存的损耗。享元对象能做到共享的...

  • 享元模式

    什么是享元模式 将对象中有共同特性的属性提取出来进行共享,避免对象的重复创建从而减少内存的消耗 示例图 示例场景 ...

  • 享元模式

    享元模式定义 英文名称:flyweight使用共享对象可以有效的支持大量的细粒度对象强调:对象共享 享元模式应用场...

网友评论

      本文标题:享元模式(对象共享,避免创建过多的对象)

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