设计模式-享元详解(从入门到源码使用)

享元模式是一种设计模式,旨在通过共享减少对象数量,提高系统性能。本文介绍了享元模式的基本概念,并通过Spring框架中的应用、图形化系统、网页浏览器缓存管理等实例详细阐述其实际使用。在Spring中,享元模式被用于BeanFactory和事件监听器的管理,以优化对象创建和销毁。此外,结合对象池进一步展示了享元模式如何提高系统性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

享元模式

介绍

享元模式是一种设计模式,它的目的是通过共享来有效地支持大量细粒度的对象。它通过共享已有的可公用的内部状态来大幅度减少需要创建的对象数量。这样可以节省系统资源,并同时提高系统的性能。

享元模式通过将对象的内部状态和外部状态分离开来,只保留对象的外部状态。对象的内部状态可以共享,而对象的外部状态则是独立的。这样可以有效地减少系统中对象的数量,并同时提高系统的性能。

二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 事件
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值