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

定义

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

相关的名称定义

  • 内部状态:可以共享的状态,不会随着环境的变化而变化。
  • 外包状态:不可以共享的状态,会随着环境的变化而变化
  • 享元工厂:创建享元对象的工厂。判断对象是否存在,若存在直接返回,不存在则创建新的对象并返回。通常是一个Map来保存,键为内部状态。

享元模式的使用场景

  • 系统中存在大量的相似对象
  • 细粒度对象具备较相近的外部状态,也就是说对象没有特定身份。
  • 需要缓冲池的场景

享元模式的优缺点

优点:

  • 尽可能减少内存的使用
  • 提高性能、避免内存移除

缺点:

  • 使得系统更加复杂
  • 读取外部状态时间加长

享元模式实例

设计模式-享元模式(Flyweight)_第1张图片
享元模式实例.png
设计模式-享元模式(Flyweight)_第2张图片
调用流程.png
设计模式-享元模式(Flyweight)_第3张图片
目录结构.png
  • Ticket
public interface Ticket {
    void showTicketInfo();
}
  • TrainTicket
public class TrainTicket implements Ticket {

    private String from;
    private String to;
    private int price;

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

    @Override
    public void showTicketInfo() {
        this.price = new Random().nextInt(100);
        System.out.println("从 " + from + " 开往 " + to + " 的列车,票价为:" + price);
    }
    
}
  • TicketFactory
public class TicketFactory {

    private Map mTickets = new HashMap();

    public Ticket getTicket(String from, String to) {
        String key = from + "-" + to;
        if (mTickets.containsKey(key)) {
            Ticket ticket = mTickets.get(key);
            return ticket;
        }

        TrainTicket ticket = new TrainTicket(from, to);
        mTickets.put(key, ticket);
        return ticket;
    }
    
    public int getHoldTicketCount(){
        return mTickets.size();
    }

}
  • Client
public class Client {
    
    public static void main(String[] args) {
        TicketFactory ticketFactory = new TicketFactory();
        
        Ticket ticket1 = ticketFactory.getTicket("深圳", "北京");
        ticket1.showTicketInfo();
        
        Ticket ticket2 = ticketFactory.getTicket("海口", "广州");
        ticket2.showTicketInfo();
        
        Ticket ticket3 = ticketFactory.getTicket("海口", "广州");
        ticket3.showTicketInfo();
        
        System.out.println("持有ticket实例数:"+ticketFactory.getHoldTicketCount());
    }

}

参考:

  • 《大话设计模式》
  • 《android源码设计模式》

你可能感兴趣的:(设计模式-享元模式(Flyweight))