• 蝇量模式(轻量级模式)也叫享元模式(共用一个方法)

  • 景观设计软件项目遇到的问题:

    • 设置一个公园或者小区,会有树的大小,外观等等

    • 虽然对象不复杂,但是如果量大就会消耗很多内存,比如10000000棵树

  • 代码分析:

package yingliangmoshi.old;/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-05-06
* Time: 19:07
*/
public class Tree {private int xCoord, yCoord, age;public Tree(int xCoord, int yCoord, int age){this.xCoord = xCoord;this.yCoord = yCoord;this.age = age;}public void display(){
//        System.out.println(xCoord);}
}
package yingliangmoshi.old;/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-05-06
* Time: 19:09
*/
public class TreesTest {private int length = 1000000;private Tree[] treeList = new Tree[length];public TreesTest(){for(int i = 0;i<length;i++){treeList[i] = new Tree((int)(Math.random() * length), (int)(Math.random() * length), (int)(Math.random() * length)%5);}}public void display() {for(int i =  0; i<treeList.length;i++){treeList[i].display();}}
}
package yingliangmoshi.old;/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-05-06
* Time: 19:12
*/
public class MainTest {public static void main(String[] args) {showInfo();TreesTest treesTest;treesTest = new TreesTest();showInfo();treesTest.display();showInfo();}public static void showInfo(){long max = Runtime.getRuntime().maxMemory();long total = Runtime.getRuntime().totalMemory();long free  = Runtime.getRuntime().totalMemory();long used = total - free;System.out.println("最大内存= "+max);System.out.println("已分配内存= "+ total);System.out.println("已分配剩余内存内存= "+free);System.out.println("已用内存= "+used);System.out.println("当前时间="+System.currentTimeMillis());System.out.println();}
}
  • 这些树之间有什么关系,大量的对象导致内存泄漏,如何将对象变少:

  • 分成两种状态:

    • 内部状态:可以公用的放在一起的 display()

    • 外部状态:xCoord, yCoord, age

      • 内部状态放到类里面
      • 外部状态简化成一个树管理的类来管理外部状态
      • 显示的时候使用外部状态在调用内部状态
  • 代码分析:

package yingliangmoshi.TreeFlyWeight;/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-05-06
* Time: 19:25
*//**
* 内部状态
*/
public class TreeFlyWeight {public TreeFlyWeight(){}//只放一个内部状态public void display(int xCoord, int yCoord, int age){
//        System.out.println(xCoord);}
}
package yingliangmoshi.TreeFlyWeight;/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-05-06
* Time: 19:26
*//**
* 处理外部状态
*/
public class TreeManager {public int length = 1000000;//将外部状态放到数组中int[] xArray = new int[length];int[] yArray = new int[length];int[] ageArray = new int[length];private TreeFlyWeight treeFlyWeight;public TreeManager(){treeFlyWeight = new TreeFlyWeight();for(int i = 0;i<length;i++){xArray[i] = (int)(Math.random() * length);yArray[i] = (int)(Math.random() * length);ageArray[i] =(int)(Math.random() * length)%5;}}public void displayTrees(){for(int i= 0;i<length;i++){treeFlyWeight.display(xArray[i], yArray[i], ageArray[i]);}}}
package yingliangmoshi.TreeFlyWeight;/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-05-06
* Time: 19:29
*/
public class MainTest {public static void main(String[] args) {showInfo();TreeManager treeManager;treeManager = new TreeManager();showInfo();treeManager.displayTrees();showInfo();}public static void showInfo(){long max = Runtime.getRuntime().maxMemory();long total = Runtime.getRuntime().totalMemory();long free  = Runtime.getRuntime().totalMemory();long used = total - free;System.out.println("最大内存= "+ max);System.out.println("已分配内存= "+ total);System.out.println("已分配剩余内存内存= "+ free);System.out.println("已用内存= " + used);System.out.println("当前时间="+System.currentTimeMillis());System.out.println();}
}
  • 不管项目变得多么复杂:
当存在多个细粒度对象的时候,找到公共方法,抽象成一个抽象类

设计模式(10)--蝇量模式相关推荐

  1. java蝇量模式_Head First设计模式——蝇量和解释器模式

    蝇量 蝇量模式:如果让某个类的一个实例能用来提供许多"虚拟实例",就使用蝇量模式. 在一个设计房子的平台中,周围要加上一些树,树有一个坐标XY坐标位置,而且可以根据树的年龄动态将自 ...

  2. Java设计模式10,建造者模式

    目录 一.建造者模式 二.建造者模式的结构 1.抽象建造者(Builder) 2.具体建造者(ConcreteBuilder) 3.指挥者(Director) 4.产品(Product) 三.建造者模 ...

  3. Java单体应用 - 架构模式 - 03.设计模式-10.装饰器模式

    原文地址:http://www.work100.net/training/monolithic-architecture-design-patterns-decorator-pattern.html ...

  4. Java描述设计模式(10):组合模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.文件系统 下图是常见的计算机文件系统的一部分. 文件系统是一个树结构,树上长有节点.树的节点有两种: 树枝节点 即文件夹,有 ...

  5. 《Head First设计模式》 读书笔记16 其余的模式(二) 蝇量 解释器 中介者

    <Head First设计模式> 读书笔记16 其余的模式(二) 蝇量 解释器 中介者 蝇量(Flyweight Pattern) 如想让某个类的一个实例能用来提供许多"虚拟实例 ...

  6. Java设计模式之享元模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  7. JAVA23种设计模式(2)-结构型模式7种

    JAVA23种设计模式(2)-结构型模式7种 把类结合在一起形成更大的结构 适配器模式(adapter) 一句话:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容 这是平时比较常见的一种模 ...

  8. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  9. 设计模式:享元模式(Flyweight)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

最新文章

  1. 论文:基于粒子群优化的测试数据生成及其实证分析-----生成过程以及实验(计算机研究与发展)
  2. #ifndef.#define, #endif 的用法
  3. Quartz2 定时器 《一》(概述)
  4. STM32分散加载文件
  5. [ES6] 细化ES6之 -- 函数的扩展
  6. java堆外内存为何比java堆更适合用来进行网络IO操作
  7. Java springcloud B2B2C o2o多用户商城 springcloud架构- ribbon
  8. VMware Ubuntu安装详细过程(非常靠谱)
  9. php视频转码hls,GitHub - wanglimeng/ffmpeg-demo: 使用 ffmpeg 实现视频转码。
  10. Windows 10 微信双开或多开【PC端】
  11. Adobe Photoshop CS5永久序列号
  12. Vue-组件自定义事件
  13. ch.ethz.ssh2._MindTerm SSH客户端3.4版已发布
  14. 有关OLE对象的使用(1)
  15. STC 纯硬件自动下载电路 - 三极管负脉冲电路
  16. 【Spring源码】4. 自己搞个标签?~自定义标签保姆级全过程(图解向,堆图预警)
  17. Matlab 将计算结果制作成 gif 动画
  18. 理解对数——金融问题中的自然对数(以e为底的对数)
  19. 冯·诺依曼--数学奇才计算机之父
  20. csdn学习会员拼团

热门文章

  1. 2022年Q2全国网络零售发展指数同比增长3.3%
  2. 墨西哥付款方式有哪些
  3. U盘启动快捷键查询列表
  4. CodeGear2007到CodeGear2009全系列自动破解工具更新到v1.0.0.237
  5. 2022-2027年中国指纹识别行业市场调研及未来发展趋势预测报告
  6. RabbitVCS 对比不同后取消新增内容
  7. ZIP加密文件破解:john简介
  8. 葡萄城ComponentOne全功能开发控件套包发布2017V3 新版本
  9. 为什么现在都流行的前后端分离了?
  10. 常用数据库的图标基本认识