美文网首页
设计模式-享元模式(Flyweight)

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

作者: 小菜_charry | 来源:发表于2017-08-01 11:38 被阅读30次

    定义

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

    相关的名称定义

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

    享元模式的使用场景

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

    享元模式的优缺点

    优点:

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

    缺点:

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

    享元模式实例

    享元模式实例.png 调用流程.png 目录结构.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<String, Ticket> mTickets = new HashMap<String, Ticket>();
    
        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)

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