享元模式 用来降低对象的创建数量,例如一些工具方法,spring中的单例, getBean方法获取单例就是一个典型的享元模式运用,先判断在系统内存中是否存在该对象, 如果不存在就创建该对象,放入内存中并返回,如果存在则直接返回内存中存在的对象。 String 也是享元模式的运用,String 都是存在于字符串常量池中,有就是直接获取, 没有就创建并放入字符串常量池中。
package structuralpattern;
import java.util.HashMap;
import java.util.Map;
/**
* @author tx
* @version 1.0
* @date 2024/1/9 9:41
* @description:
* 享元模式
* 用来降低对象的创建数量,例如一些工具方法,spring中的单例,
* getBean方法获取单例就是一个典型的享元模式运用,先判断在系统内存中是否存在该对象,
* 如果不存在就创建该对象,放入内存中并返回,如果存在则直接返回内存中存在的对象。
* String 也是享元模式的运用,String 都是存在于字符串常量池中,有就是直接获取,
* 没有就创建并放入字符串常量池中。
*/
public class FlyweightPattern {
public static void main(String[] args) {
BeanFactory beanFactory = new BeanFactory();
// 获取对象
FlyweightColor red = beanFactory.getBean("red", FlyweightColor.class);
FlyweightColor red1 = beanFactory.getBean("red", FlyweightColor.class);
// 查看对象是否为同一个对象
System.out.printf("第一个对象:%s,第二个对象%s,是否相同:%b\n",red,red1,red1==red);
Box bbox = beanFactory.getBean("bbox", Box.class);
Box bbox1 = beanFactory.getBean("bbox", Box.class);
System.out.printf("第一个对象:%s,第二个对象%s,是否相同:%b\n",bbox,bbox1,bbox==bbox1);
}
}
/**
* 简单的bean工厂
*/
class BeanFactory{
// 缓存
private static final Map<String,Object> beanCache = new HashMap<>();
/**
* 获取bean对象
* @param beanName bean对象的名称
* @param type bean对象的class
* @return bean
*/
public<T> T getBean(String beanName,Class<T> type){
// 尝试从缓存中获取
Object o = beanCache.get(beanName);
// 没获取到,就通过class 创建对象,并放入缓存
if (o==null){
try {
// 不考虑带参构造函数
o = type.newInstance();
beanCache.put(beanName,o);
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
// 返回获取到的对象,并按照范型强制转换
return (T) o;
}
}
// 简单对象
class FlyweightColor{
public void show(){
System.out.println("颜色"+this.toString());
}
}
class Box{
public void box(){
System.out.println("盒子"+this.toString());
}
}