设计模式(10)--蝇量模式
蝇量模式(轻量级模式)也叫享元模式(共用一个方法)
景观设计软件项目遇到的问题:
设置一个公园或者小区,会有树的大小,外观等等
虽然对象不复杂,但是如果量大就会消耗很多内存,比如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)--蝇量模式相关推荐
- java蝇量模式_Head First设计模式——蝇量和解释器模式
蝇量 蝇量模式:如果让某个类的一个实例能用来提供许多"虚拟实例",就使用蝇量模式. 在一个设计房子的平台中,周围要加上一些树,树有一个坐标XY坐标位置,而且可以根据树的年龄动态将自 ...
- Java设计模式10,建造者模式
目录 一.建造者模式 二.建造者模式的结构 1.抽象建造者(Builder) 2.具体建造者(ConcreteBuilder) 3.指挥者(Director) 4.产品(Product) 三.建造者模 ...
- Java单体应用 - 架构模式 - 03.设计模式-10.装饰器模式
原文地址:http://www.work100.net/training/monolithic-architecture-design-patterns-decorator-pattern.html ...
- Java描述设计模式(10):组合模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.文件系统 下图是常见的计算机文件系统的一部分. 文件系统是一个树结构,树上长有节点.树的节点有两种: 树枝节点 即文件夹,有 ...
- 《Head First设计模式》 读书笔记16 其余的模式(二) 蝇量 解释器 中介者
<Head First设计模式> 读书笔记16 其余的模式(二) 蝇量 解释器 中介者 蝇量(Flyweight Pattern) 如想让某个类的一个实例能用来提供许多"虚拟实例 ...
- Java设计模式之享元模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- JAVA23种设计模式(2)-结构型模式7种
JAVA23种设计模式(2)-结构型模式7种 把类结合在一起形成更大的结构 适配器模式(adapter) 一句话:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容 这是平时比较常见的一种模 ...
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
- 设计模式:享元模式(Flyweight)
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
最新文章
- 论文:基于粒子群优化的测试数据生成及其实证分析-----生成过程以及实验(计算机研究与发展)
- #ifndef.#define, #endif 的用法
- Quartz2 定时器 《一》(概述)
- STM32分散加载文件
- [ES6] 细化ES6之 -- 函数的扩展
- java堆外内存为何比java堆更适合用来进行网络IO操作
- Java springcloud B2B2C o2o多用户商城 springcloud架构- ribbon
- VMware Ubuntu安装详细过程(非常靠谱)
- php视频转码hls,GitHub - wanglimeng/ffmpeg-demo: 使用 ffmpeg 实现视频转码。
- Windows 10 微信双开或多开【PC端】
- Adobe Photoshop CS5永久序列号
- Vue-组件自定义事件
- ch.ethz.ssh2._MindTerm SSH客户端3.4版已发布
- 有关OLE对象的使用(1)
- STC 纯硬件自动下载电路 - 三极管负脉冲电路
- 【Spring源码】4. 自己搞个标签?~自定义标签保姆级全过程(图解向,堆图预警)
- Matlab 将计算结果制作成 gif 动画
- 理解对数——金融问题中的自然对数(以e为底的对数)
- 冯·诺依曼--数学奇才计算机之父
- csdn学习会员拼团