• 设计模式——享元模式


    享元模式是什么?

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

    享元模式解决什么问题?

    如淘宝中每个店家的网站有首页、分类、会员等

    public class WebSite {
        private String type = "";
    
        public WebSite(String type) {
            this.type= type;
        }
    
        public void show() {
            System.out.println("网站类型: " + type);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    当使用时

     WebSite A = new WebSite("首页");
     A.show();
     
     WebSite B = new WebSite("首页");
     B.show();
    
    • 1
    • 2
    • 3
    • 4
    • 5

    实际上不可能为每个商家都新建一个网站实例,不同网站之间只有数据不同

    享元模式实现

    抽象WebSite,展示的时候传入数据加载

    abstract class WebSite {
        abstract void show(User user);
    }
    
    class concreteWebSite extends WebSite {
        private String type = "";
    
        public concreteWebSite(String name) {
            this.type = name;
        }
    
        @Override
        void show(User user) {
            System.out.println("网站类型: " + type + ", 用户:" + user.getName());
        }
    }
    
    class User {
        private String name;
    
        public User(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    创建工厂维护WebSite,第一次创建时存起来,此后返回已创建的对象

    class WebSiteFactory {
        private Hashtable flyweights = new Hashtable<>();
    
        public WebSite getWebSite(String key) {
            if (!flyweights.contains(key)) {
                flyweights.put(key, new concreteWebSite(key));
            }
            return flyweights.get(key);
        }
    
        public int getWebSiteCount() {
            return flyweights.size();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    当使用时,从工厂中取出WebSite,为其设置数据

    WebSiteFactory webSiteFactory = new WebSiteFactory();
    WebSite A = webSiteFactory.getWebSite("首页");
    A.show(new User("A"));
    
    WebSite B = webSiteFactory.getWebSite("首页");
    B.show(new User("B"));
    
    WebSite C = webSiteFactory.getWebSite("分类");
    C.show(new User("C"));
    
    System.out.println("网站数量: "+webSiteFactory.getWebSiteCount());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    String的实现就是运用了享元模式

    String s1 = new String("s");
    String s2 = new String("s");
    System.out.println("s1==s2: " + (s1 == s2));
    System.out.println("s1.equals(s2): " + s1.equals(s2));
    
    String s3 = "s";
    String s4 = "s";
    System.out.println("s3 == s4: " + (s3 == s4));
    System.out.println("s3.equals(s4): " + s3.equals(s4));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    打印如下,当使用new时,创建的对象地址不一样,当直接赋值时,s4的引用指向字符串"s"

    s1==s2: false
    s1.equals(s2): true
    s3 == s4: true
    s3.equals(s4): true
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    热销产品缺货,滞销产品积压?WMS系统如何打造智能仓储
    记录学习--分页时会查两遍数据库吗
    STM32实战总结:HAL之modbus
    Chapter 13 贝叶斯网络实践
    Camera2开发基础知识篇——手机影像参数
    瑞芯微rk1126 编译mp4v2记录 rk1126移植 ffmpeg
    树模型(一)孤立森林
    esp-hosted 方案介绍
    python面向对象基础-封装
    嵌入式养成计划-38----C++--匿名对象--友元--常成员函数和常对象--运算符重载
  • 原文地址:https://blog.csdn.net/qq_35258036/article/details/133071191