zoukankan      html  css  js  c++  java
  • 设计模式-18-享元

    简介:使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件

    目的:

    总结:通过共享模式减少内存使用和重复对象

    组成:享元管理器, 享元, 辅助类
    1,享元

    package com.design.r.flyweight;
    /**
     * 英雄基类
     */
    public abstract class Hero {
        
        
        protected String userName;               //英雄名称
        protected String[] kills = new String[4];//技能
        
        public Hero() {
            super();
            this.userName = getUserName();
            initKills();
        }
    
        public void attact(){
            System.out.println(userName + " 发动了物理攻击!");
        }
        
        public abstract String getUserName();
        public abstract void initKills();
        
    }
    package com.design.r.flyweight;
    /**
     * 英雄A
     */
    public class HeroA extends Hero {
    
        @Override
        public String getUserName() {
            return "英雄A";
        }
    
        @Override
        public void initKills() {
            kills[0] = "技能A-1";
            kills[1] = "技能A-2";
            kills[2] = "技能A-3";
            kills[3] = "技能A-4";
        }
    
    }
    package com.design.r.flyweight;
    /**
     * 英雄B
     */
    public class HeroB extends Hero {
    
        @Override
        public String getUserName() {
            return "英雄B";
        }
    
        @Override
        public void initKills() {
            kills[0] = "技能B-1";
            kills[1] = "技能B-2";
            kills[2] = "技能B-3";
            kills[3] = "技能B-4";
        }
    
    }

    2,辅助类

    package com.design.r.flyweight;
    /**
     * 英雄状态和技能的组合
     */
    public class Role {
        
        private Hero hero;//英雄
        private Long bp; //血量
        private Long mp; //蓝量
        
        public Role(Hero hero) {
            super();
            this.hero = hero;
        }
        
        public void attact(){
            hero.attact();
        }
    
        public Long getBp() {
            return bp;
        }
    
        public void setBp(Long bp) {
            this.bp = bp;
        }
    
        public Long getMp() {
            return mp;
        }
    
        public void setMp(Long mp) {
            this.mp = mp;
        }
    
    }

    3,享元管理器

    package com.design.r.flyweight;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 对英雄单例管理, 达到共享功能
     */
    public class HeroManager {
        
        private static HeroManager heroManager  = new HeroManager();
        private Map<String, Hero> heroMap = new HashMap<>();
        
        public static HeroManager getInstance(){
            return heroManager;
        }
        
        public Hero getHero(String userName){
            Hero hero = heroMap.get(userName);
            if(hero == null){
                if("英雄A".equals(userName)){
                    hero = new HeroA();
                }else if("英雄B".equals(userName)){
                    hero = new HeroB();
                }
                heroMap.put(userName, hero);
                return hero;
            }else{
                return hero;
            }
        }
    
    }

    4,Main

    package com.design.r.flyweight;
    /**
     * 18-享元模式
     * 
     * 通过共享模式减少内存使用和重复对象
     */
    public class MainTest {
    
        public static void main(String[] args) {
            
            //使用享元模式后,再创建了4个英雄后,HeroA和HeroB都是单例并没有产生4个实例
            
            HeroManager heroManager = new HeroManager();
            Role hero1 = new Role(heroManager.getHero("英雄A"));
            Role hero2 = new Role(heroManager.getHero("英雄A"));
            
            Role hero3 = new Role(heroManager.getHero("英雄B"));
            Role hero4 = new Role(heroManager.getHero("英雄B"));
        }
    }
  • 相关阅读:
    DOS命令备忘
    JS面向对象总结
    java 内部类如何访问外部类的对象
    java注解的学习
    VisualVM远程连接服务器设置方法
    oracle 多表插入
    jvm对类的加载顺序测试
    oracle性能学习中总结
    java 权限修饰符的总结
    oracle多单号的说明
  • 原文地址:https://www.cnblogs.com/wanhua-wu/p/7246636.html
Copyright © 2011-2022 走看看