享元模式---减少一次性消费
来源:互联网 发布:淘宝旺旺设置自动回复 编辑:程序博客网 时间:2024/04/29 01:29
声明:文章内容根据大牛博客的内容,自己理解后,给自己做的学习笔记,文末会附上大牛博客地址链接。有需要沟通交流的可加我QQ群:425120333 在日常生活中存在着许多用了一次就扔的情况,一次性筷子,一次性纸盒,一次性袋子等等,一次性的频繁使用导致资源的大量浪费。体现在代码上就是内存空间的浪费,导致内存溢出。 我平时会玩一款纸牌游戏三国杀,里面有很多的武将都是三国人物,比如关羽张飞刘备等。每个武将都有初始体力值和技能。现在来模拟下游戏场景。 人物属性类:
public class SgsFigure { private final String name; private int Hp; private final int MaxHp; private final String skill; public SgsFigure(String name, int MaxHp, String skill) { this.name = name; this.MaxHp = MaxHp; this.skill = skill; this.Hp = MaxHp; } public String getName() { return name; } public int getHp() { return Hp; } public int getMaxHp() { return MaxHp; } public String getSkill() { return skill; } public void downHp() { Hp--; } public void addHp() { Hp++; }}
场景类:
public class Client { public static void main(String[] args) { //同时有10场游戏都出现了张飞和刘备 for(int i=0;i<10;i++){ SgsFigure zhangfei = new SgsFigure("张飞", 4, "咆哮"); SgsFigure liubei = new SgsFigure("刘备", 4, "仁德"); } }}
每次如果有一场游戏中出现了张飞就要创建一个张飞实体,游戏场次多了,张飞的实体就无线增长,大大浪费了内存空间,因为多个张飞实体的名字,最大体力值,技能都是相同的,不同的只是当前的体力值。这个时候享元模式就排上用场了,享元模式指的是使用共享对象可有效地支持大量地细粒度对象。固有属性类:
public class SgsFigureFlyWeight { private final String name; private final int MaxHp; private final String skill; public SgsFigureFlyWeight(String name, int MaxHp, String skill) { this.name = name; this.MaxHp = MaxHp; this.skill = skill; } public String getName() { return name; } public int getMaxHp() { return MaxHp; } public String getSkill() { return skill; }}
每个角色地固有属性管理类
public class SgsFigureManager { static Map<String, SgsFigureFlyWeight> map = new HashMap<String, SgsFigureFlyWeight>(); public static SgsFigureFlyWeight getFigure(String name) { SgsFigureFlyWeight figure = map.get(name); if (figure == null) { if ("张飞".equals(name)) { figure = new SgsFigureFlyWeight("张飞", 4, "咆哮"); } else if ("刘备".equals(name)) { figure = new SgsFigureFlyWeight("刘备", 4, "仁德"); } map.put(name, figure); } return figure; }}
真正的角色类
public class Role { private SgsFigureFlyWeight figure; private int Hp; public Role(SgsFigureFlyWeight figure) { this.figure = figure; Hp = this.figure.getMaxHp(); } public int getHp() { return Hp; } public void downHp() { Hp--; } public void addHp() { Hp++; }}
场景类:
public class Client { public static void main(String[] args) { //同时有10场游戏都出现了张飞和刘备 for (int i = 0; i < 10; i++) { Role zhangfei = new Role(SgsFigureManager.getFigure("张飞")); Role liubei = new Role(SgsFigureManager.getFigure("刘备")); } }}
通过这样的改动之后,每个张飞的固定属性就都只会创建一次,通过管理类中的map来保存该信息,创建一次之后,map中就保存有张飞固定属性的各个值,下次需要的时候直接从里面取出来用即开。 享元模式将对象的内部属性和外部属性分离开来了,内部属性是固定不变的,不会随着环境的变化而改动,外部属性是可以被改变的,该模式保证了内部属性多次创建导致的内存空间浪费。 参考大牛博客:http://www.cnblogs.com/zuoxiaolong/p/pattern19.html
0 0
- 享元模式---减少一次性消费
- iap支付总结(一次性消费购买)
- 深入浅出享元模式
- 享元模式
- 享元(FlyWeight)模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式Flyweight
- 享元模式
- 享元模式
- 享元模式
- FlyWeight 享元模式
- 享元模式(Flyweight)
- 享元模式
- 享元模式
- 享元模式
- jquery : 插件 jsgrid 范例
- 安卓用Boolean来判断打开和关闭
- 机器人学习共享资料
- ACM水题
- Java中常见的问题和经典知识
- 享元模式---减少一次性消费
- scanf格式码
- 【oracle】Oracle11g安装配置以及客户端访问
- 循环链表应用------Josephus环问题
- haproxy实现hive的ha
- 【Ubuntu 16】 wifi连接 并解决无桌面图标问题
- 什么是MySQL触发器 ?如何利用mysql创建一个触发器?
- Android Studio如何恢复移除的Module
- 多米诺骨牌