享元模式 ゝ一纸荒年。 2022-07-12 07:28 128阅读 0赞 ## 简介 ## 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 -------------------- ## 案例 ## -------------------- ### 坦克大战设计 ### **每个坦克都是一个对象** 以下两种可以是共享的 那么我么可以称他们为:**内部状态** > 1. 型号 > 2. 颜色 另外一些则是不可共享的 我们称之为:**外部状态** > 1. 坐标 -------------------- ### 代码实现 ### **享元设计模式一般包括以下的四块内容** * * **FlyWeight 抽象享元类** > 这个通常是一个接口或者是一个抽象类,这个可以提供内部状态,设置外部状态。 > 我这边为了简洁,只写一个内部状态。 > > public interface TankFlyWeight { void setColor(String color); String getColor(); void display(Coordinate coordinate); } -------------------- * * **ConcreteFlyWeight具体享元类** > 具体享元类主要是为内部状态,也就是 共有的状态 提供一个存储的地方 class ConcreateTank implements TankFlyWeight{ private String model; private String color; public void setColor(String color) { this.color = color; } public ConcreateTank(String color) { super(); this.color = color; } public void display(Coordinate coordinate) { System.out.println("坦克颜色:"+color); System.out.println("坦克位置:"+coordinate.getX()+"=="+coordinate.getY()); } public String getColor() { // TODO Auto-generated method stub return color; } -------------------- * * **UnsharedConcreateFlyWeight 非共享享元类** > 用于存储外部状态,也就是经常改变的状态 public class Coordinate { private int x,y; public Coordinate(int x, int y) { super(); this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } } * * **FlyWeightFactory 享元工厂类** > 创建并管理享元对象,一般是键值对的形式 import java.util.HashMap; import java.util.Map; public class TankFlyWeightFactory { private static Map<String, TankFlyWeight> map = new HashMap<String, TankFlyWeight>(); public static TankFlyWeight getTank(String color) { if (map.get(color)!=null) { return map.get(color); } else { TankFlyWeight tankFlyWeight = new ConcreateTank(color); map.put(color, tankFlyWeight); return map.get(color); } } } * * **最后 定义一个客户类进行测试** > 创建一个客户类,通过享元工厂进行生产取出 public class Client { public static void main(String[] args) { TankFlyWeight tank1 = TankFlyWeightFactory.getTank("黄色"); TankFlyWeight tank2 = TankFlyWeightFactory.getTank("黄色"); System.out.println(tank1); System.out.println(tank2); tank1.display(new Coordinate(10, 12)); tank2.display(new Coordinate(13,15)); } } 输出结果是 com.guxiang.flyweight.ConcreateTank@5d888759 com.guxiang.flyweight.ConcreateTank@5d888759 坦克颜色:黄色 坦克位置:10==12 坦克颜色:黄色 坦克位置:13==15 我们可以看到,两个对象的 hashcode值是一样的,这证明它们其实是同一个对象,这样就避免了内存中存放过多的相似的对象,而导致内存不够用的情况下。 -------------------- **UML图实现如下** ![这里写图片描述][SouthEast] ### 例子 ### 1. 享元模式在身边随处可见,最常用的要属 String类 string类中有一个常量池的概念,其内部也是一个享元设计模式实现的。 2. 常见的还有 线程池 ThreadLocal 3. 以及数据连接池 [SouthEast]: /images/20220711/7a99d3c4e411433bbbe28f92d7726995.png
相关 享元模式 简介 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应 ゝ一纸荒年。/ 2022年07月12日 07:28/ 0 赞/ 129 阅读
相关 享元模式 享元模式(Flyweight),就是运用共享技术有效地支持大量细粒度的对象。 享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(Externa 冷不防/ 2022年06月16日 23:20/ 0 赞/ 160 阅读
相关 享元模式 1.使用场景: 内存资源比较稀缺,不要随便浪费,如果有很多相同或者类似的对象,通过使用享元模式的方法,节省内存,例如线程池以及String类等。 2.UML表示 悠悠/ 2022年05月31日 09:49/ 0 赞/ 144 阅读
相关 享元模式 定义: 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应 谁借莪1个温暖的怀抱¢/ 2022年05月14日 02:54/ 0 赞/ 137 阅读
相关 享元模式 享元模式 一、概述 1. 内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的 对象,我们可以通过享元模式,节省内存。 2. 享元模式以共享的方式高效地 忘是亡心i/ 2022年04月18日 04:55/ 0 赞/ 162 阅读
相关 享元模式 [享元模式][Link 1] 模式说明 所谓享元模式就是运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现 ゝ一世哀愁。/ 2021年11月23日 06:46/ 0 赞/ 213 阅读
相关 享元模式 当系统中出现大量相同、相似的对象时,会导致系统性能下降。享元模式通过共享技术对相同或相似对象进行重用,从而解决这一问题。在享元模式中,存储共享实例对象的地方称为享元池 (Fly 怼烎@/ 2021年11月11日 10:50/ 0 赞/ 248 阅读
相关 享元模式 12.享元模式 我们可以共用一个 Hello world 对象,其中字符串 “Hello world” 为内部状态,可共享;字体颜色为外部状态,不可共享,由 逃离我推掉我的手/ 2021年09月17日 00:00/ 0 赞/ 242 阅读
相关 享元模式 一 点睛 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。 柔光的暖阳◎/ 2021年07月24日 21:31/ 0 赞/ 345 阅读
相关 享元模式 简介 > Use sharing to support large numbers of fine-grained objects efficiently. > 使用 青旅半醒/ 2021年05月18日 20:36/ 0 赞/ 362 阅读
还没有评论,来说两句吧...