享元模式
介绍
享元模式是一种设计模式,它的目的是通过共享来有效地支持大量细粒度的对象。它通过共享已有的可公用的内部状态来大幅度减少需要创建的对象数量。这样可以节省系统资源,并同时提高系统的性能。
享元模式通过将对象的内部状态和外部状态分离开来,只保留对象的外部状态。对象的内部状态可以共享,而对象的外部状态则是独立的。这样可以有效地减少系统中对象的数量,并同时提高系统的性能。
二spring源码中的应用(可以先看后面两个简单的例子)
最常见的就是在sprin源码中:
spring 框架中有多个地方使用了享元模式。例如,在 Spring 的事件处理机制中,使用了享元模式来管理事件监听器对象的创建和销毁,从而节省系统资源,提高系统性能。
另外,在 Spring 的 BeanFactory 中,也使用了享元模式来管理 Bean 对象的创建和销毁,从而实现对象的复用,节省系统资源,提高系统性能。
beanfactory中
// 定义 Bean 接口
interface Bean {
// 省略其他方法
}
// 定义具体 Bean 类
class ConcreteBean implements Bean {
// 省略其他方法
}
// 定义 BeanFactory
class BeanFactory {
//这里就是享元模式的体现
private static final Map<String, Bean> beans = new HashMap<>();
public static Bean getBean(String beanName) {
Bean bean = beans.get(beanName);
if (bean == null) {
// 从配置文件加载 Bean 的配置信息
BeanDefinition beanDefinition = loadBeanDefinitionFromConfigFile(beanName);
// 根据配置信息创建 Bean 对象
bean = createBean(beanDefinition);
beans.put(beanName, bean);
}
return bean;
}
}
// 使用 BeanFactory
public class Main {
public static void main(String[] args) {
// 获取两个不同名称的 Bean
Bean bean1 = BeanFactory.getBean("bean1");
Bean bean2 = BeanFactory.getBean("bean2");
// 使用 Bean
// ...
}
}
在这个例子中,我们定义了一个 Bean 接口表示 Bean 对象,并定义了一个 ConcreteBean 类来实现该接口。然后,我们定义了一个 BeanFactory 类来管理 Bean 对象的创建和缓存。该类包含一个 Map 对象,用来存储已经加载过的 Bean 对象,并实现了 getBean 方法来获取指定名称的 Bean 对象。如果该 Bean 对象还没有被加载,则需要从配置文件中加载 Bean 的配置信息,并根据配置信息创建 Bean 对象,然后,将新创建的 Bean 对象添加到 Map 中,并返回该对象。如果该 Bean 对象已经被加载过,则直接从 Map 中获取并返回。
最后,在 main 方法中,我们通过调用 getBean 方法来获取两个不同名称的 Bean 对象,然后使用这些 Bean 对象。由于我们使用了享元模式,因此每个名称对应的 Bean 只会被创建一次,并被缓存在 Map 中。
事件监听器
// 定义事件监听器接口
interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
void onApplicationEvent(E event);
}
// 定义事件
class MyEvent extends ApplicationEvent {
// 省略其他方法
}
// 定义事件监听器
class MyListener implements ApplicationListener<MyEvent> {
public void onApplicationEvent(MyEvent event) {
// 处理 MyEvent 事件