享元模式


享元模式

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 POSTER_MAP = new HashMap();

    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

相关