首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 如何制定性能调优标准?
02 | 如何制定性能调优策略?
03 | 字符串性能优化不容小觑,百M内存轻松存储几十G数据
04 | 慎重使用正则表达式
05 | ArrayList还是LinkedList?使用不当性能差千倍
06 | Stream如何提高遍历集合效率?
07 | 深入浅出HashMap的设计与优化
08 | 网络通信优化之I/O模型:如何解决高并发下I/O瓶颈?
09 | 网络通信优化之序列化:避免使用Java序列化
10 | 网络通信优化之通信协议:如何优化RPC网络通信?
11 | 答疑课堂:深入了解NIO的优化实现原理
12 | 多线程之锁优化(上):深入了解Synchronized同步锁的优化方法
13 | 多线程之锁优化(中):深入了解Lock同步锁的优化方法
14 | 多线程之锁优化(下):使用乐观锁优化并行操作
15 | 多线程调优(上):哪些操作导致了上下文切换?
16 | 多线程调优(下):如何优化多线程上下文切换?
17 | 并发容器的使用:识别不同场景下最优容器
18 | 如何设置线程池大小?
19 | 如何用协程来优化多线程业务?
20 | java性能调优热点问题解答
21 | 磨刀不误砍柴工:欲知JVM调优先了解JVM内存模型
22 | 深入JVM即时编译器JIT,优化Java编译
23 | 如何优化垃圾回收机制?
24 | 如何优化JVM内存分配?
25 | 内存持续上升,我该如何排查问题?
27 | 单例模式:如何创建单一对象优化系统性能?
28 | 原型模式与享元模式:提升系统性能的利器
29 | 如何使用设计模式优化并发编程?
30 | 生产者消费者模式:电商库存设计优化
31 | 装饰器模式:如何优化电商系统中复杂的商品价格策略?
32 | MySQL调优之SQL语句:如何写出高性能SQL语句?
33 | MySQL调优之事务:高并发场景下的数据库事务调优
34 | MySQL调优之索引:索引的失效与优化
35 | 记一次线上SQL死锁事故:如何避免死锁?
36 | 什么时候需要分表分库?
37 | 电商系统表设计优化案例分析
38 | 数据库参数设置优化,失之毫厘差之千里
当前位置:
首页>>
技术小册>>
Java性能调优实战
小册名称:Java性能调优实战
### 28 | 原型模式与享元模式:提升系统性能的利器 在软件开发领域,性能优化始终是一个核心议题,尤其是在处理大规模数据、高并发请求或资源受限的环境中。Java作为一种广泛使用的编程语言,其丰富的设计模式库为开发者提供了强大的工具来应对性能挑战。其中,原型模式(Prototype Pattern)与享元模式(Flyweight Pattern)作为两种高效利用资源、减少对象创建开销的设计模式,对于提升系统性能具有显著作用。本章将深入探讨这两种模式的工作原理、应用场景、实现方式以及它们如何协同工作以进一步优化系统性能。 #### 一、原型模式:克隆的艺术 ##### 1.1 原型模式概述 原型模式是一种创建型设计模式,它允许一个对象通过复制自身来创建新的对象实例,而无需通过构造函数或工厂方法实例化。这种模式基于现有的对象实例来创建新的对象,从而避免了在创建新对象时可能产生的复杂初始化过程,特别是在对象创建成本较高或对象初始化过程复杂时,原型模式尤为有效。 ##### 1.2 原型模式的结构 - **Prototype(抽象原型类)**:声明一个克隆自身的接口。 - **ConcretePrototype(具体原型类)**:实现一个克隆自身的操作,该操作通常通过覆盖`Object`类的`clone()`方法来实现。 - **Client(客户端)**:通过调用具体原型类的克隆方法来创建新的对象实例。 ##### 1.3 实现细节 在Java中,实现原型模式的关键在于正确覆盖`Object`类的`clone()`方法,并声明该类实现了`Cloneable`接口。这是因为`clone()`方法在默认情况下是受保护的,并且如果类没有实现`Cloneable`接口,调用`clone()`方法将抛出`CloneNotSupportedException`。 ```java public class ConcretePrototype implements Cloneable { // 类的成员变量 @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } // 其他方法 } ``` ##### 1.4 应用场景 - **对象创建成本高昂**:如大型对象或复杂对象的创建。 - **性能敏感的应用**:需要快速生成大量相似对象的场景。 - **避免使用构造函数**:当构造函数调用复杂或需要避免时。 #### 二、享元模式:共享的艺术 ##### 2.1 享元模式概述 享元模式是一种结构型设计模式,它通过使用共享对象来减少内存占用和提高系统性能。在享元模式中,多个客户端可能共享同一个对象实例,而不是每个客户端都拥有自己独立的对象副本。这种模式特别适用于那些创建成本较高且对象状态可以外部化或参数化的场景。 ##### 2.2 享元模式的结构 - **Flyweight(抽象享元类)**:定义了一个接口,用于创建并管理享元对象,同时声明一个业务操作。 - **ConcreteFlyweight(具体享元类)**:实现了抽象享元类,并为内部状态(不共享)和外部状态(可共享)提供存储结构。 - **UnsharedConcreteFlyweight(非共享具体享元类)**:并非所有享元对象都需要共享,非共享具体享元类不能被共享,但它实现了与共享享元相同的接口。 - **FlyweightFactory(享元工厂类)**:负责创建和管理享元对象。它确保合理地共享享元,当用户请求一个享元对象时,工厂会检查是否已经存在一个具有相同内部状态的享元对象,如果存在,则直接返回该对象,否则创建一个新的享元对象。 - **Client(客户端)**:在客户端代码中,通过享元工厂获取享元对象,并与之交互。 ##### 2.3 实现细节 在Java中,实现享元模式的关键在于区分对象的内部状态(存储在对象内部,不随环境改变而改变)和外部状态(随环境改变而改变,通常由客户端保持)。享元工厂负责维护一个享元池,用于存储和管理已创建的享元对象。 ```java public class FlyweightFactory { private HashMap<String, Flyweight> flyweights = new HashMap<>(); public Flyweight getFlyweight(String key) { Flyweight flyweight = flyweights.get(key); if (flyweight == null) { flyweight = new ConcreteFlyweight(key); // 假设构造函数接受一个key作为内部状态 flyweights.put(key, flyweight); } return flyweight; } } public interface Flyweight { void operation(ExternalState state); } public class ConcreteFlyweight implements Flyweight { private String intrinsicState; public ConcreteFlyweight(String state) { this.intrinsicState = state; } @Override public void operation(ExternalState state) { // 使用内部状态和外部状态执行操作 } } ``` ##### 2.4 应用场景 - **大量细粒度对象**:当系统中存在大量相似对象,且这些对象的创建和销毁成本较高时。 - **状态可外部化**:对象的某些状态可以独立于对象本身存在,即这些状态可以由外部参数或环境提供。 - **系统资源有限**:在内存或处理器资源受限的环境中,减少对象数量可以显著提升性能。 #### 三、原型模式与享元模式的协同作用 虽然原型模式和享元模式在提升系统性能方面各有侧重,但它们在某些场景下可以相互补充,共同发挥更大的作用。 - **结合使用场景**:当系统中需要频繁创建大量相似但又不完全相同的对象时,可以先通过原型模式快速复制一个基础对象,然后利用享元模式的思想,将对象中的部分状态(如可共享的部分)进行共享,以减少内存占用。这样,既保持了对象的快速创建能力,又实现了资源的有效共享。 - **优化策略**:在实现时,可以设计一个复合模式,其中原型模式负责对象的快速复制,而享元模式则负责对象的共享管理。通过享元工厂来管理这些通过原型模式创建的对象的共享状态,确保在需要时能够重用已存在的对象实例,从而进一步提升系统性能。 #### 四、总结 原型模式与享元模式作为提升系统性能的利器,在软件开发中扮演着重要角色。原型模式通过复制现有对象来避免复杂的初始化过程,从而加快对象创建速度;而享元模式则通过共享对象来减少内存占用,提高资源利用率。两者结合使用,可以在保证系统灵活性和可扩展性的同时,显著提升系统性能。在实际应用中,开发者应根据具体场景和需求灵活选择并合理运用这两种设计模式,以达到最佳的性能优化效果。
上一篇:
27 | 单例模式:如何创建单一对象优化系统性能?
下一篇:
29 | 如何使用设计模式优化并发编程?
该分类下的相关小册推荐:
JAVA 函数式编程入门与实践
Java语言基础6-面向对象高级
Java语言基础7-Java中的异常
Mybatis合辑1-Mybatis基础入门
SpringBoot零基础到实战
Java语言基础14-枚举和注解
深入理解Java虚拟机
Java语言基础8-Java多线程
Java语言基础12-网络编程
Java语言基础10-Java中的集合
SpringBoot合辑-初级篇
Java必知必会-Maven初级