企业网站接入微信支付千锋教育培训
web/
2025/9/28 13:36:04/
文章来源:
企业网站接入微信支付,千锋教育培训,沈阳 网站开发制作,网络营销的策略包括码到三十五 #xff1a; 个人主页 目录 一、引言二、享元设计模式的概念1. 对象状态的划分2. 共享机制 三、享元设计模式的组成四、享元设计模式的工作原理五、享元模式的使用六、享元设计模式的优点和适用场景结语 [参见]#xff1a;
Java设计模式#xff1a;核心概述 个人主页 目录 一、引言二、享元设计模式的概念1. 对象状态的划分2. 共享机制 三、享元设计模式的组成四、享元设计模式的工作原理五、享元模式的使用六、享元设计模式的优点和适用场景结语 [参见]
Java设计模式核心概述一
Java设计模式单例模式之六种实现方式详解二
Java设计模式工厂模式之简单工厂、工厂方法、抽象工厂三
Java设计模式建造者模式之经典与流式的三种实现四
Java设计模式适配器模式的三种形式五
Java设计模式深入装饰器模式的三种写法六
Java设计模式组合模式之透明与安全的两种实现七
Java设计模式代理模式的静态和动态之分八
Java设计模式外观模式之优雅门面九
Java设计模式组合优于继承化身之桥接模式十
一、引言
设计模式是一种用于解决在特定上下文中经常出现的问题的优秀解决方案。它们为开发人员提供了一种通用的设计语言有助于创建灵活且可维护的代码。享元设计模式Flyweight Pattern是结构型模式之一它通过共享对象来减少系统中对象的数量从而降低系统资源消耗提高系统性能。
二、享元设计模式的概念
享元设计模式Flyweight Pattern是众多设计模式中的一种它专注于解决由于创建大量相似对象而导致的系统资源消耗过高的问题。这一模式的核心思想是“共享”即通过共享尽可能多的对象来减少系统中对象的总数进而降低内存占用和提高系统性能。
1. 对象状态的划分
在享元模式中一个关键的概念是将对象的状态划分为两部分内在状态Intrinsic State和外在状态Extrinsic State。 内在状态这是对象内部固有的、不会随环境改变而变化的属性。内在状态通常是可以被共享的因为它不会因外在条件的不同而有所区别。例如在一个字符渲染系统中字符的字体、大小等属性就可以被视为内在状态因为不论在什么上下文中相同字体和大小的字符都可以被复用。 外在状态这是对象在特定上下文中才有的、会随着环境改变而变化的属性。外在状态是不能被共享的因为它依赖于对象所处的具体环境和上下文。继续以字符渲染为例字符的位置、颜色等可能因用户交互或页面布局的不同而变化因此这些属性被视为外在状态。
2. 共享机制
享元模式通过实现一个享元工厂Flyweight Factory来管理对象的创建和共享。享元工厂会维护一个已创建享元对象的缓存通常是一个哈希表或其他快速查找数据结构并根据请求的类型通常由内在状态决定来返回相应的对象实例。如果请求的类型在缓存中已存在则直接返回该实例如果不存在则创建一个新的享元对象将其添加到缓存中并返回给请求者。
提升性能与资源利用率 通过上述共享机制享元模式能够显著减少系统中相似对象的数量从而降低内存占用。同时由于避免了不必要的对象创建和销毁操作系统的整体性能也会得到提升。这在处理大量相似对象时尤为重要如文本编辑器中的字符渲染、图形界面中的图形元素绘制等场景。
综上所述享元设计模式是一种通过共享对象来优化系统资源消耗和提高性能的设计方案。它通过将对象状态划分为内在状态和外在状态并利用享元工厂来管理对象的创建和共享从而实现了对相似对象的高效处理。
三、享元设计模式的组成 Flyweight享元这是享元对象它封装了可以被共享的状态并且可以被高效地复用。 FlyweightFactory享元工厂这个工厂负责创建和管理享元对象。它通常会缓存已创建的享元对象并在请求相同类型的享元时返回已有的实例。 Client客户端客户端代码使用享元工厂来获取享元对象并在需要时将其外在状态传递给享元。
四、享元设计模式的工作原理
享元模式的核心思想是“共享”。当系统中需要创建大量相似对象时享元模式通过以下步骤来优化对象的创建和使用 提取共享状态首先识别出对象中可以共享的状态并将其封装在享元类中。 分离变化状态将不能共享或随上下文变化的状态从享元类中分离出来作为外在状态。 创建享元工厂实现一个享元工厂来管理享元对象的创建和缓存。当客户端请求一个新的享元时工厂首先检查缓存中是否已经存在相同类型的享元。如果存在则返回该实例否则创建一个新的享元实例并添加到缓存中。 客户端使用客户端代码通过享元工厂获取享元对象并根据需要设置其外在状态。享元对象在执行操作时会结合其内在状态和传递进来的外在状态来完成任务。
五、享元模式的使用
享元模式的实现通常涉及到一个享元类表示要共享的对象一个享元工厂类负责创建和管理享元实例以及客户端代码。下面代码展示如何使用享元模式来减少具有相同属性的对象的数量。 首先定义享元类 Circle表示一个圆形对象其内在状态是颜色这里假设所有圆的大小相同因此不需要作为内在状态。
public class Circle {private String color; // 内在状态颜色public Circle(String color) {this.color color;}public String getColor() {return color;}// 假设的绘制方法这里仅打印信息public void draw() {System.out.println(绘制一个颜色为 color 的圆形);}
}然后定义享元工厂类 CircleFactory它负责管理并缓存已经创建的 Circle 对象。
import java.util.HashMap;
import java.util.Map;public class CircleFactory {private MapString, Circle circleMap new HashMap(); // 用于缓存Circle对象的Map// 根据颜色获取Circle对象如果缓存中没有则创建一个public Circle getCircle(String color) {Circle circle circleMap.get(color);if (circle null) {circle new Circle(color);circleMap.put(color, circle); // 将新创建的Circle对象加入缓存}return circle;}
}最后编写客户端代码来使用享元工厂创建和使用享元对象。
public class FlyweightPatternDemo {private static final CircleFactory circleFactory new CircleFactory();public static void main(String[] args) {// 从享元工厂获取圆形对象并绘制它们Circle circle1 circleFactory.getCircle(红色);circle1.draw(); // 输出绘制一个颜色为 红色的圆形Circle circle2 circleFactory.getCircle(蓝色);circle2.draw(); // 输出绘制一个颜色为 蓝色的圆形Circle circle3 circleFactory.getCircle(红色);circle3.draw(); // 输出绘制一个颜色为 红色的圆形注意这里是复用的circle1// 验证circle1和circle3是否是同一个对象System.out.println(circle1 circle3); // 输出true}
}Circle 类是享元它的内在状态是颜色。CircleFactory 是一个享元工厂它使用一个 HashMap 来缓存已经创建的 Circle 对象。当客户端请求一个具有特定颜色的圆形时享元工厂首先检查缓存中是否已经有一个具有该颜色的圆形。如果有则返回该对象否则创建一个新的 Circle 对象并将其添加到缓存中。通过这种方式具有相同颜色的圆形对象实例在系统中只会被创建一次从而减少了内存占用。
六、享元设计模式的优点和适用场景
优点 减少内存消耗通过共享对象实例减少了系统中对象的数量从而降低了内存消耗。 提高性能避免了频繁的对象创建和销毁操作提高了系统的运行性能。 简化系统设计享元模式有助于将对象的共享部分和变化部分分离开来使系统设计更加清晰和灵活。
适用场景 当系统中需要处理大量相似对象时如字符串、图形对象等。 当对象的创建成本较高且大量对象之间存在大量重复数据时。 当需要优化系统资源消耗和提高系统性能时。
结语
享元设计模式是一种高效处理大量相似对象的设计方案。它通过共享对象实例来减少资源消耗和提高性能适用于多种场景。在使用享元模式时需要仔细识别对象的共享状态和变化状态并合理设计享元类和享元工厂。通过合理运用享元模式可以构建出更加灵活、高效和可维护的软件系统。 听说...关注下面公众号的人都变牛了纯技术纯干货 !
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83357.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!