享元模式
1.基础知识
定义∶
提供了减少对象数量从而改善应用所需的对象结构的方式
运用共享技术有效地支持大量细粒度的对象
说人话就是共享资源的意思
类型∶结构型
适用场景
常常应用于系统底层的开发,以便解决系统的性能问题。
系统有大量相似对象、需要缓冲池的场景。
优点
减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率
减少内存之外的其他资源占用
缺点
关注内/外部状态、关注线程安全问题
使系统、程序的逻辑复杂化
内部状态指对象共享出来的信息,存储在享元对象内部并且不会随环境的改变而改变;
外部状态指对象得以依赖的一个标记,是随环境改变而改变的、不可共享的状态。
相关设计模式
享元模式和代理模式
享元模式和单例模式
2.实战
使用KFC上新产品的业务逻辑,当有一款新的产品出售时,需要为这个产品绘制推广海报。这样经销商发售新产品的时候就可以直接拿来推广了,如果海报不存在,就需要制作海报。为此设计海报接口类,实际海报类,海报工厂
UML如图:
/**
* 海报接口类
* @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();
}
}
}
控制台输出
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);
}