设计模式 - 享元模式
封面图
•
2026-03-27
•
设计模式
5
0
0
0
**享元模式(Flyweight Pattern)** --- ### 一、定义 **享元模式**(Flyweight Pattern)是一种**结构型设计模式**,它通过**共享对象**来**减少内存中对象的数量**,从而提高性能。它适用于**大量细粒度对象**的场景,通过复用已有的对象来避免重复创建。 --- ### 二、核心思想 > **共享细粒度对象,减少内存开销。** 在享元模式中,**对象分为两个部分:内部状态(Internal State)和外部状态(External State)**: - **内部状态**:可以被多个对象共享的、不随环境变化的状态。 - **外部状态**:不能被共享的、依赖于上下文的状态,需要由客户端维护。 --- ### 三、结构图 ``` +------------------+ | Flyweight | +------------------+ | +-----------------------------+ | | +------------------+ +------------------+ | ConcreteFlyweight | | FlyweightFactory | +------------------+ +------------------+ | | | | v v +------------------+ +------------------+ | Client |<----------| Factory Method | +------------------+ +------------------+ ``` --- ### 四、类图说明 - **Flyweight**:抽象类或接口,定义了享元对象的接口。 - **ConcreteFlyweight**:实现Flyweight接口的具体对象。 - **FlyweightFactory**:负责创建并管理享元对象,确保对象的共享。 - **Client**:使用享元对象的客户端代码。 --- ### 五、适用场景 1. **系统中存在大量相似对象**,例如图形界面中的图标、文本字符等。 2. **对象的创建和销毁成本较高**,如数据库连接、线程池等。 3. **需要节省内存资源**,尤其是当对象数量非常庞大的时候。 --- ### 六、优点 - 减少内存使用,提升性能。 - 提高系统的可扩展性。 - 降低对象创建和管理的复杂度。 --- ### 七、缺点 - 增加了系统的复杂性,需要区分内部和外部状态。 - 需要额外的代码来管理对象的共享机制。 --- ### 八、示例代码(Java) ```java // 1. 定义享元接口 interface Character { void display(char c); } // 2. 实现享元类 class ConcreteCharacter implements Character { private char c; public ConcreteCharacter(char c) { this.c = c; } @Override public void display(char c) { System.out.print(c); } } // 3. 享元工厂类 class CharacterFactory { private static Map<Character, Character> pool = new HashMap<>(); public static Character getCharacter(char c) { if (!pool.containsKey(c)) { pool.put(c, new ConcreteCharacter(c)); } return pool.get(c); } } // 4. 客户端代码 public class Client { public static void main(String[] args) { String text = "Hello World"; for (char c : text.toCharArray()) { Character character = CharacterFactory.getCharacter(c); character.display(c); } } } ``` --- ### 九、实际应用案例 - **文字处理软件**(如Word)中的字符显示。 - **游戏开发**(如大量的敌人、子弹等对象)。 - **图形用户界面(GUI)** 中的控件、图标等。 --- ### 十、与相关模式的区别 | 模式 | 说明 | |------|------| | **单例模式** | 确保一个类只有一个实例;而享元模式是共享多个对象。 | | **组合模式** | 将对象组合成树形结构以表示“部分-整体”层次结构;与享元无关。 | | **代理模式** | 控制对对象的访问;与享元不同,享元关注的是共享对象。 | --- ### 十一、总结 享元模式的核心在于**共享对象**,通过**减少重复对象的创建**来优化内存使用和性能。适用于**大量细粒度对象**的场景,尤其适合在资源受限或性能敏感的系统中使用。 如果你有具体的使用场景或代码问题,也可以告诉我,我可以帮你进一步分析。
上一篇:
设计模式 - 外观模式
下一篇:
设计模式 - 解释器模式
标题录入,一次不能超过6条
留言
评论