13 享元模式

享元模式

享元模式 用来降低对象的创建数量,例如一些工具方法,spring中的单例, getBean方法获取单例就是一个典型的享元模式运用,先判断在系统内存中是否存在该对象, 如果不存在就创建该对象,放入内存中并返回,如果存在则直接返回内存中存在的对象。 String 也是享元模式的运用,String 都是存在于字符串常量池中,有就是直接获取, 没有就创建并放入字符串常量池中。
13 享元模式_第1张图片

demo- 简单beanFactory

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());
    }
}

打印

在这里插入图片描述

你可能感兴趣的:(设计模式,享元模式,java,开发语言)