• 享元模式


    享元模式

    1.基础知识

    定义∶

    提供了减少对象数量从而改善应用所需的对象结构的方式

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

    说人话就是共享资源的意思

    类型∶结构型

    适用场景

    常常应用于系统底层的开发,以便解决系统的性能问题。

    系统有大量相似对象、需要缓冲池的场景。

    优点

    减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率

    减少内存之外的其他资源占用

    缺点

    关注内/外部状态、关注线程安全问题

    使系统、程序的逻辑复杂化

    内部状态指对象共享出来的信息,存储在享元对象内部并且不会随环境的改变而改变;

    外部状态指对象得以依赖的一个标记,是随环境改变而改变的、不可共享的状态。

    相关设计模式

    享元模式和代理模式

    享元模式和单例模式


    2.实战

    使用KFC上新产品的业务逻辑,当有一款新的产品出售时,需要为这个产品绘制推广海报。这样经销商发售新产品的时候就可以直接拿来推广了,如果海报不存在,就需要制作海报。为此设计海报接口类,实际海报类,海报工厂

    UML如图:

    image-20220118104220226

    /**
     * 海报接口类
     * @Author LYS
     * @Date 2022/1/18 10:15
     * @Version 1.0
     */
    public interface Poster {
        //打印海报
        void extension();
    }
    
    /**
     * 实际海报类
     *
     * @Author LYS
     * @Date 2022/1/18 10:16
     * @Version 1.0
     */
    public class AdvertisementPoster implements Poster {
        //内部状态,是一个固定态
        private String title = "【新品发售海报】:";
        //外部状态,会根据传入的不同而不同
        private String foodName;
        private String content;
    
        @Override
        public void extension() {
            System.out.println(content);
        }
    
    
        public String getContent() {
            return content;
        }
    
        public AdvertisementPoster(String foodName) {
            this.foodName = foodName;
            this.content = title + foodName;
        }
    }
    
    /**
     * 海报工厂类
     *
     * @Author LYS
     * @Date 2022/1/18 10:19
     * @Version 1.0
     */
    public class PosterFactory {
        private static final Map<String, AdvertisementPoster> POSTER_MAP = new HashMap<String, AdvertisementPoster>();
    
        public static AdvertisementPoster getAdvertisementPoster(String foodName) {
            AdvertisementPoster advertisementPoster = POSTER_MAP.get(foodName);
            if (advertisementPoster == null) {
                advertisementPoster = new AdvertisementPoster(foodName);
                System.out.print("创建新品:" + foodName + "       ");
                System.out.println("创建新品海报:" + advertisementPoster.getContent());
                POSTER_MAP.put(foodName, advertisementPoster);
            }
            return advertisementPoster;
        }
    }
    
    /**
     * @Author LYS
     * @Date 2022/1/18 10:21
     * @Version 1.0
     */
    public class Test {
        private static final String foods[] = {"上校鸡块", "嫩牛五方", "奥尔良鸡腿堡", "薯条"};
    
        public static void main(String[] args) {
            for (int i = 0; i < 10; i++) {
                String food = foods[(int) (Math.random() * foods.length)];
                AdvertisementPoster advertisementPoster = (AdvertisementPoster) PosterFactory.getAdvertisementPoster(food);
                advertisementPoster.extension();
            }
        }
    }
    

    控制台输出

    image-20220118104326330


    3.源码

    1.Integer.valueof方法

    -128≤x≤127都在缓存里,超过这个范围的数字都是new出来的

    private static class IntegerCache {
    	static final int low = -128;
    	static final int high;
        static {
        // high value may be configured by property
        int h = 127;
        ....
        }
    public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
    

    image-20220118104504733

  • 相关阅读:
    驾驶细节
    python 字符串前面加u,r,b,f的含义
    pandas dataframe指定列字符串转成数字的方法
    python 休息随机秒
    Windows搭建ffmpeg推流服务端 sky
    在golang中如何正确判断接口是否为nil
    快速了解一门技术的学习方法
    TortoiseGit使用教程(图文详细版)
    centos7升级安装openssl版本
    CentOS7防火墙,开放端口配置
  • 原文地址:https://www.cnblogs.com/yslu/p/15816771.html
Copyright © 2020-2023  润新知