设计模式-结构型模式之享元模式

75 阅读1分钟

结构型模式-享元模式

image.png

享元模式

享元模式是池技术的重要实现方式,使用共享技术有效的支持大量细粒度的对象。常见的有数据库连接池、String常量池等。

举个例子:用户去查看火车票的信息,信息都有起始站、目的站、价格等。如果多个用户在查看同一个起始、目的站时都会创建一个对象,这样的对象就会创建很多重复的,我们可以将可以共享的信息保存起来,在查看的时候从缓存里取。

image.png

抽象享元角色-显示火车票信息


public abstract class ITicket {  
  
    abstract void showTicketInfo();  
}

具体享元角色-火车票信息

public class TicketInfo extends ITicket{  
  
    private String from;  

    private String to;  

    private Integer price;  

    public TicketInfo(String from, String to, Integer price) {  
        this.from = from;  
        this.to = to;  
        this.price = price;  
    }  

    @Override  
    void showTicketInfo() {  
        System.out.println("起始站:"+this.from+",终点站:"+this.to+",价格:"+this.price);  
    }  
}

享元工厂

public class TicketInfoFactory {  
    private HashMap<String, TicketInfo> pool = new HashMap<>();  

    public TicketInfo getTicketInfo(String from, String to){  
        String key = from+"->"+to;  
        if(!pool.containsKey(key)){  
            Random random = new Random();  
            int i = random.nextInt(500);  
            pool.put(key,new TicketInfo(from, to,i));  
        }  
        return pool.get(key);  
    }  
}

测试

public class Main {  
    public static void main(String[] args) {  
        TicketInfoFactory factory = new TicketInfoFactory();  
        TicketInfo ticketInfo = factory.getTicketInfo("西安", "营口");  
        ticketInfo.showTicketInfo();  
    }  
}

享元模式优点:

  • 减少重复对象的创建,降低程序内存的占用

享元模式缺点:

  • 提高了系统复杂性

适用场景:

  • 存在大量相似的对象
  • 需要使用缓冲池