• java设计模式(十)——享元模式


    1、基本概念

    享元模式( Flyweight Pattern )又称为轻量级模式,是对象池的一种实现。

    类似于线程池,常量池,可以避免不停的创建和销毁多个对象,消耗性能。提供了减少对象数量

    从而改善应用所需的对象结构的方式。其宗旨是共享细粒度对象,将多个对同一对象的访问集中起来

    ,不必为每个访问者创建一一个单独的对象,以此来降低内存的消耗,属于结构型模式。

    2、类图和角色

    类图:

    角色:

    抽象享元角色( Flyweight) : 享元对象抽象基类或者接口, 同时定义出对象的外部状态和内部状态
    的接口或实现;
    具体享元角色( ConcreteFlyweight ) : 实现抽象角色定义的业务。该角色的内部状态处理应该与
    环境无关,不能出现会有一个操作改变内部状态,同时修改了外部状态;
    享元工厂( FlyweightFactory ) : 负责管理享元对象池和创建享元对象。

    3、案例

    案例:我们在查询车票的时候,每次在填完出发地和目的地后,创建一个车票信息,然后进行查询。

    我们将出发地和目的地作为key,车票对象作为value,缓存起来,避免每次查询都去创建这个对象。

    类图:

     抽象享元角色:ITicket 

    public interface ITicket {
        void queryTicketInfo();
    }

    具体享元角色:提供一个简单得查询方法

    public class Ticket implements ITicket {
        private String from;
        private String to;
        private int price;
        private String type;
    
        public Ticket(String from, String to) {
            this.from = from;
            this.to = to;
        }
    
        @Override
        public void queryTicketInfo() {
            System.out.printf("路线:%s->%s  价格:%s 元,座位类型:%s 
    
    ", from, to,  500 ,"硬座");
        }
    }

    享元工厂:TicketFactory 

    class TicketFactory {
        private static Map<String, ITicket> pool = new ConcurrentHashMap<String,ITicket>();
    
        public static ITicket queryTicket(String from, String to) {
            String key = from + "->" + to;
            if (pool.containsKey(key)) {
                System.out.println("从缓存中获取");
                return pool.get(key);
            }
            ITicket ticket = new Ticket(from, to);
            pool.put(key, ticket);
            return ticket;
        }
    }

    这个就是享元模式,是个很常见的设计模式。

    还有常见的如字符串类型:

          String s1 = "hello world";
            String s2 = "hello world";
            System.out.println(s1 == s2 );

    输出结果是相等的,这里是常量池,它会常量池中查找,找到了就不需要创建了。

    还有Integer

          Integer n1 = 100;
            Integer n2 = 100;
            System.out.println(n1 == n2);
    
            Integer n3 = 1000;
            Integer n4 = 1000;
            System.out.println(n3 == n4);

    输出结果,上面是true,下面是false,这是因为当值大于-128小于127时,是直接从缓存中返回,看下面官方源码:

        * This method will always cache values in the range -128 to 127,
         * inclusive, and may cache other values outside of this range.
         *
         * @param  i an {@code int} value.
         * @return an {@code Integer} instance representing {@code i}.
         * @since  1.5
         */
        public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
        }

    4、优缺点

    优点:

    1、减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率;
    2、减少内存之外的其他资源占用。

  • 相关阅读:
    some ideas
    zz 牛人啊
    zz 史上最全--各银行借记卡的年费、小额管理费、转账费等!
    哪裡可以買郵票
    : 求靠谱灭蟑螂的方法
    zz 【见闻八卦】《金融时报》年度商业书单:互联网题材占一半
    IOS开发基础知识--碎片6
    IOS开发基础知识--碎片5
    IOS开发基础知识--碎片4
    IOS中关于KVC与KVO知识点
  • 原文地址:https://www.cnblogs.com/tdyang/p/13275192.html
Copyright © 2020-2023  润新知