享元模式---减少一次性消费

来源:互联网 发布:淘宝旺旺设置自动回复 编辑:程序博客网 时间: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
原创粉丝点击