享元模式 小灰灰 2020-06-13 05:55 454阅读 0赞 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 *Circle* 对象。 ### 介绍 ### **意图**:运用共享技术有效地支持大量细粒度的对象。 **主要解决**:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。 **何时使用**: 1、系统中有大量对象。 2、这些对象消耗大量内存。 3、这些对象的状态大部分可以外部化。 4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。 5、系统不依赖于这些对象身份,这些对象是不可分辨的。 **如何解决**:用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。 **关键代码**:用 HashMap 存储这些对象。 **应用实例** :1、JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。 2、数据库的数据池。 \*\*优点:\*\*大大减少对象的创建,降低系统的内存,使效率提高。 **缺点**:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。 **使用场景** :1、系统有大量相似对象。 2、需要缓冲池的场景。 **注意事项**: 1、注意划分外部状态和内部状态,否则可能会引起线程安全问题。 2、这些类必须有一个工厂对象加以控制。 ### 实现 ### 我们将创建一个 *Shape* 接口和实现了 *Shape* 接口的实体类 *Circle*。下一步是定义工厂类 *ShapeFactory*。 *ShapeFactory* 有一个 *Circle* 的 *HashMap*,其中键名为 *Circle* 对象的颜色。无论何时接收到请求,都会创建一个特定颜色的圆。*ShapeFactory* 检查它的 *HashMap* 中的 circle 对象,如果找到 *Circle* 对象,则返回该对象,否则将创建一个存储在 hashmap 中以备后续使用的新对象,并把该对象返回到客户端。 *FlyWeightPatternDemo*,我们的演示类使用 *ShapeFactory* 来获取 *Shape* 对象。它将向 *ShapeFactory* 传递信息(*red / green / blue/ black / white*),以便获取它所需对象的颜色。 ![享元模式][format_png] #### 步骤 1 #### 创建一个接口。 *Shape.java* public interface Shape { void draw(); } #### 步骤 2 #### 创建实现接口的实体类。 *Circle.java* public class Circle implements Shape { private String color; private int x; private int y; private int radius; public Circle(String color) { this.color = color; } public void setColor(String color) { this.color = color; } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } public void setRadius(int radius) { this.radius = radius; } @Override public void draw() { System.out.println("Circle: Draw() [Color : " + color + ", x : " + x + ", y : " + y + ", radius : " + radius); } } #### 步骤 3 #### 创建一个工厂,生成基于给定信息的实体类的对象。 *ShapeFactory.java* public class ShapeFactory { private static final Map<String, Shape> circleMap = new HashMap<>(); public static Shape getCircle(String color) { Circle circle = (Circle) circleMap.get(color); if (circle == null) { circle = new Circle(color); circleMap.put(color, circle); System.out.println("Creating circle of color : " + color); } return circle; } } #### 步骤 4 #### 使用该工厂,通过传递颜色信息来获取实体类的对象。 *FlyweightPatternDemo.java* public class FlyweightPatternDemo { private static final String[] colors = {"Red", "Green", "Blue", "White", "Black"}; public static void main(String[] args) { for (int i = 0; i < 20; ++i) { Circle circle = (Circle) ShapeFactory.getCircle(getRandomColor()); circle.setX(getRandomX()); circle.setY(getRandomY()); circle.setRadius(100); circle.draw(); System.out.println(); } } private static String getRandomColor() { return colors[(int) (Math.random() * colors.length)]; } private static int getRandomX() { return (int) (Math.random() * 100); } private static int getRandomY() { return (int) (Math.random() * 100); } } #### 步骤 5 #### 验证输出。 Creating circle of color : White Circle: Draw() [Color : White, x : 56, y : 48, radius : 100 Circle: Draw() [Color : White, x : 80, y : 65, radius : 100 Circle: Draw() [Color : White, x : 54, y : 75, radius : 100 Creating circle of color : Red Circle: Draw() [Color : Red, x : 3, y : 10, radius : 100 Creating circle of color : Blue Circle: Draw() [Color : Blue, x : 78, y : 0, radius : 100 Circle: Draw() [Color : Red, x : 85, y : 77, radius : 100 Creating circle of color : Green Circle: Draw() [Color : Green, x : 1, y : 69, radius : 100 Circle: Draw() [Color : Red, x : 45, y : 27, radius : 100 Circle: Draw() [Color : Green, x : 52, y : 48, radius : 100 Creating circle of color : Black Circle: Draw() [Color : Black, x : 81, y : 71, radius : 100 Circle: Draw() [Color : Red, x : 75, y : 89, radius : 100 Circle: Draw() [Color : Black, x : 78, y : 12, radius : 100 Circle: Draw() [Color : Green, x : 11, y : 43, radius : 100 Circle: Draw() [Color : Black, x : 28, y : 20, radius : 100 Circle: Draw() [Color : Green, x : 64, y : 84, radius : 100 Circle: Draw() [Color : Red, x : 65, y : 72, radius : 100 Circle: Draw() [Color : Red, x : 30, y : 65, radius : 100 Circle: Draw() [Color : Black, x : 50, y : 36, radius : 100 Circle: Draw() [Color : Green, x : 87, y : 77, radius : 100 Circle: Draw() [Color : Red, x : 41, y : 18, radius : 100 [format_png]: /images/1592027697378.jpg
相关 享元模式 享元模式定义 英文定义:A flyweight is an object that minimizes memory use by sharing as much data 短命女/ 2022年08月02日 14:43/ 0 赞/ 31 阅读
相关 享元模式 享元模式(Flyweight),就是运用共享技术有效地支持大量细粒度的对象。 享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(Externa 冷不防/ 2022年06月16日 23:20/ 0 赞/ 195 阅读
相关 享元模式 1.使用场景: 内存资源比较稀缺,不要随便浪费,如果有很多相同或者类似的对象,通过使用享元模式的方法,节省内存,例如线程池以及String类等。 2.UML表示 悠悠/ 2022年05月31日 09:49/ 0 赞/ 182 阅读
相关 享元模式 定义 享元模式:运用共享技术有效的支持大量细粒度的对象。 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太 向右看齐/ 2022年05月14日 12:15/ 0 赞/ 29 阅读
相关 享元模式 享元模式 一、概述 1. 内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的 对象,我们可以通过享元模式,节省内存。 2. 享元模式以共享的方式高效地 忘是亡心i/ 2022年04月18日 04:55/ 0 赞/ 195 阅读
相关 享元模式 前言 享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。 一、网站抽象类 1 public abstract c 墨蓝/ 2021年12月09日 00:53/ 0 赞/ 152 阅读
相关 享元模式 [享元模式][Link 1] 模式说明 所谓享元模式就是运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现 ゝ一世哀愁。/ 2021年11月23日 06:46/ 0 赞/ 247 阅读
相关 享元模式 当系统中出现大量相同、相似的对象时,会导致系统性能下降。享元模式通过共享技术对相同或相似对象进行重用,从而解决这一问题。在享元模式中,存储共享实例对象的地方称为享元池 (Fly 怼烎@/ 2021年11月11日 10:50/ 0 赞/ 295 阅读
相关 享元模式 12.享元模式 我们可以共用一个 Hello world 对象,其中字符串 “Hello world” 为内部状态,可共享;字体颜色为外部状态,不可共享,由 逃离我推掉我的手/ 2021年09月17日 00:00/ 0 赞/ 285 阅读
相关 享元模式 元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的... 小灰灰/ 2020年06月13日 05:55/ 0 赞/ 455 阅读
还没有评论,来说两句吧...