首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
CGLIB AopProxy实现 - CglibAopProxy
AopProxyFactory配置管理器 - AdvisedSupport
Advisor链工厂接口与实现 - AdvisorChainFactory
目标对象来源接口与实现 - TargetSource
代理对象创建基础类 - ProxyCreatorSupport
AdvisedSupport事件监听器 - AdvisedSupportListener
ProxyCreatorSupport标准实现 - ProxyFactory
ProxyCreatorSupport IoC容器实现 - ProxyFactoryBean
ProxyCreatorSupport AspectJ实现 - AspectJProxyFactory
IoC容器自动代理抽象 - AbstractAutoProxyCreator
IoC容器自动代理标准实现
IoC容器自动代理 AspectJ 实现 - AspectJAwareAdvisorAutoProxyCreator
AOP Infrastructure Bean接口 - AopInfrastructureBean
AOP上下文辅助类 - AopContext
代理工厂工具类 - AopProxyUtils
AOP工具类 - AopUtils
AspectJ Enable模块驱动实现 - @EnableAspectJAutoProxy
AspectJ XML配置驱动实现 -
AOP配置Schema-based 实现 -
Aspect Schema-based实现 -
Pointcut Schema-based实现 -
Around Advice Schema-based实现 -
Before Advice Schema-based实现 -
After Advice Schema-based实现 -
After Returning Advice Schema-based实现 -
After Throwing Advice Schema-based实现 -
Adviser Schema-based实现 -
Introduction Schema-based实现 -
作用域代理Schema-based实现 -
抽象工厂模式(Abstract factory)实现
构建器模式(Builder)实现
工厂方法模式(Factory method)实现
原型模式(Prototype)实现
单例模式(Singleton)实现
适配器模式(Adapter)实现
组合模式(Composite)实现
装饰器模式(Decorator)实现
享元模式(Flyweight)实现
代理模式(Proxy)实现
模板方法模式(Template Method)实现
责任链模式(Chain of Responsibility)实现
观察者模式(Observer)实现
策略模式(Strategy)实现
命令模式(Command)实现
状态模式(State)实现
Spring AOP在 Spring 事件(Events)
Spring AOP在Spring 事务(Transactions)理论基础
Spring AOP在Spring 事务(Transactions)源码分析
Spring AOP在Spring 缓存(Caching)
Spring AOP在Spring本地调度(Scheduling)
当前位置:
首页>>
技术小册>>
Spring AOP 编程思想(下)
小册名称:Spring AOP 编程思想(下)
### 享元模式(Flyweight)实现 在《Spring AOP 编程思想(下)》的这本技术书籍中,深入探讨享元模式(Flyweight Pattern)的实现与应用,不仅是对设计模式理论的一次实践深化,也是提升Spring框架下应用程序性能与资源利用率的关键步骤。享元模式是一种结构型设计模式,旨在通过共享技术来有效支持大量细粒度对象的复用,从而减少内存占用和提高系统效率。 #### 一、享元模式概述 享元模式的核心思想是运用共享技术来有效地支持大量细粒度对象的复用。在软件系统中,如果存在大量的相似对象,存储这些对象将会消耗大量的内存资源,并且在这些对象的管理上也变得非常复杂和低效。享元模式通过将这些对象的信息分为内部状态(Intrinsic State)和外部状态(Extrinsic State)来处理。内部状态是存储在享元对象内部并且可以在多个对象中共享的状态,而外部状态则是依赖于特定上下文、不能被多个对象共享的状态。 #### 二、享元模式的结构 享元模式主要包含以下几个角色: 1. **Flyweight(抽象享元类)**:定义了一个接口,通过这个接口可以访问到享元对象的内部状态,并可能定义出一个用于创建并管理享元对象的享元工厂。 2. **ConcreteFlyweight(具体享元类)**:实现了Flyweight接口,并为内部状态增加存储空间。ConcreteFlyweight对象在被创建时可以被设置内部状态,但是内部状态必须是可以被共享的。 3. **UnsharedConcreteFlyweight(非共享具体享元类)**:不是所有的Flyweight子类都需要被共享。非共享具体享元类不需要存储内部状态,也不可以被共享。 4. **FlyweightFactory(享元工厂类)**:负责创建和管理享元对象。当客户端请求一个享元对象时,享元工厂会首先检查是否已经存在一个具有相同内部状态的享元对象,如果存在,则直接返回这个已有的享元对象;如果不存在,则创建一个新的享元对象并添加到享元池中。 5. **Client(客户端)**:通过FlyweightFactory来获取享元对象,并设置外部状态。 #### 三、享元模式的实现步骤 以下是一个简单的享元模式实现示例,我们将以字符渲染系统为例,说明如何通过享元模式来优化内存使用和提高效率。 ##### 1. 定义抽象享元类(Flyweight) 首先,我们定义一个`CharacterFlyweight`接口,作为所有字符享元类的基类。 ```java public interface CharacterFlyweight { void display(String extrinsicState); } ``` ##### 2. 实现具体享元类(ConcreteFlyweight) 然后,我们实现几个具体的字符享元类,比如`LetterA`、`LetterB`等,它们实现了`CharacterFlyweight`接口。 ```java public class LetterA implements CharacterFlyweight { @Override public void display(String fontStyle) { System.out.println("Displaying A in " + fontStyle); } } // 类似地,可以创建LetterB, LetterC等 ``` ##### 3. 创建享元工厂类(FlyweightFactory) 接下来,我们创建一个享元工厂类`CharacterFlyweightFactory`,用于管理和创建享元对象。 ```java import java.util.HashMap; import java.util.Map; public class CharacterFlyweightFactory { private Map<Character, CharacterFlyweight> flyweights = new HashMap<>(); public CharacterFlyweight getFlyweight(char key) { CharacterFlyweight flyweight = flyweights.get(key); if (flyweight == null) { switch (key) { case 'A': flyweight = new LetterA(); break; case 'B': flyweight = new LetterB(); // 假设存在LetterB类 break; // 更多字符类型 default: flyweight = new UnsharedConcreteFlyweight(key); } flyweights.put(key, flyweight); } return flyweight; } // 非共享享元类的简单实现 private static class UnsharedConcreteFlyweight implements CharacterFlyweight { private char key; public UnsharedConcreteFlyweight(char key) { this.key = key; } @Override public void display(String fontStyle) { System.out.println("Displaying unshared character '" + key + "' in " + fontStyle); } } } ``` ##### 4. 客户端使用 最后,在客户端中,我们通过享元工厂来获取享元对象,并设置其外部状态(如字体样式)。 ```java public class TextProcessor { private CharacterFlyweightFactory factory; public TextProcessor(CharacterFlyweightFactory factory) { this.factory = factory; } public void processText(String text, String fontStyle) { for (int i = 0; i < text.length(); i++) { CharacterFlyweight flyweight = factory.getFlyweight(text.charAt(i)); flyweight.display(fontStyle); } } public static void main(String[] args) { CharacterFlyweightFactory factory = new CharacterFlyweightFactory(); TextProcessor processor = new TextProcessor(factory); processor.processText("Hello, World!", "Arial"); } } ``` #### 四、享元模式在Spring AOP中的应用 虽然享元模式本身并不直接应用于Spring AOP框架的内部实现,但我们可以从性能优化的角度思考其在Spring AOP应用场景下的潜在价值。Spring AOP通过动态代理实现面向切面编程,这意味着对于每一个被增强的类,都会生成一个代理对象。如果系统中存在大量的增强(Advice)或切面(Aspect),且这些切面被应用于大量的bean上,那么生成的代理对象数量可能会非常庞大,从而占用大量内存。 在这种情况下,可以考虑将享元模式的思想引入Spring AOP的代理创建过程中,通过共享相同的增强逻辑来减少代理对象的数量。例如,可以设计一个代理工厂,该工厂负责根据增强的配置信息来创建代理对象,并缓存已经创建的代理对象。当需要为某个bean创建代理时,工厂首先检查缓存中是否已存在具有相同增强配置的代理对象,如果存在则直接返回该对象,否则才创建新的代理对象并缓存起来。 然而,需要注意的是,由于Spring AOP的代理对象通常包含对目标对象的引用,因此直接应用享元模式可能并不总是可行或高效的,因为这涉及到代理对象与目标对象之间的复杂关系管理。因此,在实际应用中,应该根据具体场景和需求来评估是否采用以及如何采用享元模式的思想来优化Spring AOP的性能。 #### 五、总结 享元模式是一种重要的设计模式,它通过共享技术来有效支持大量细粒度对象的复用,从而减少内存占用和提高系统效率。在Spring AOP等高级框架的应用中,虽然享元模式不直接作为内部机制存在,但其思想对于优化系统性能、减少资源消耗具有重要的指导意义。通过深入理解享元模式的原理和实现方式,我们可以更加灵活地运用这一模式来解决实际问题,提升软件系统的质量和效率。
上一篇:
装饰器模式(Decorator)实现
下一篇:
代理模式(Proxy)实现
该分类下的相关小册推荐:
经典设计模式Java版
Java语言基础11-Java中的泛型
Java性能调优实战
Java语言基础12-网络编程
手把手带你学习SpringBoot-零基础到实战
java源码学习笔记
SpringBoot合辑-高级篇
Java语言基础16-JDK8 新特性
Java并发编程
Java语言基础4-数组详解
Java语言基础8-Java多线程
Java语言基础3-流程控制