·

享元模式在王者荣耀中的应用

·

一、简述

在王者荣耀中,有许多英雄,每个英雄属于自己的皮肤。在玩家玩这款游戏时,可以根据自己的喜好以及打法习惯,使得不同的英雄、皮肤、铭文等随意配对,体验不一样的乐趣。

在本实例中,我们就通过上述内容描述怎样使用享元模式。创建若干个英雄“百里守约”。其中“百里守约”名称以及三个技能名称是相同的;铭文和皮肤选配是不同的。

二、享元模式(Flyweight Pattern)

享元模式理解:
高度概括:运用共享技术有效的支持大量细粒度的对象。
一个类中的成员变量表明,该类所创建对象所具有的属性,在某些程序设计中,可能一个类创建若干个对象,但是发现这些对象的一个共同特点是他们有一部分属性的取值必须是完全相同的。
享元模式的关键是使用一个称作享元的对象,为其他对象提供共享的状态,而且能够保证使用享元的对象不能更改向享元的数据。从享元的角度来看,享元所维护的数据习惯上称作享元的内部状态,而使用享元的对象或应用程序中所维护的其他数据,称作享元的外部状态,外部状态往往具有不可预见性,可能需要动态的计算来确定使用享元的对象,或应用程序在必要的时候,可以将外部状态传递给享元的方法中的参数及作为享元中方法调用的参数传入,也就是说,享元对象将其成员变量,看作是自己所维护内部状态,而将它的方法的参数看做是自己能得到的外部状态。

享元模式结构中的三种角色:
①享元接口(Flyweight):是一个接口,该接口定义了享元对外公开其内部数据的方法,以及享元接收外部数据的方法;
②具体享元(Concrete Flyweight):实现享元接口的类,该类的实例称作为享元对象或简称享元。具体享元类的成员变量为享元对象的内部状态,显然,对象的内部状态必须与所处的周围环境无关。即要保证使用享元对象的应用程序无法更改享元的内部状态,只有这样才能使得享元对象在系统中被共享,因为享元对象是用来共享的,所以不能允许用户各自的使用具体享元来创建对象,这样就无法达到共享的目的,因为不同用户用具体享元类创建的对象显然是不同的,所以具体享元类的构造方法必须是private的,其目的是不允许用户程序直接使用,具体享元类来创建享元对象,创建和管理享元对象有享元工厂负责;
③享元工厂(Flyweight Factory):享元工厂是一个类,该类的实例负责创建和管理享元对象,用户或其他对象必须请求享元工厂为它得到一个享元对象。享元工厂可以通过一个散列表,也称作共享池来管理享元对象,当用户程序或其他若干个对象向享元工厂请求一个享元对象时,如果想让工厂的散列表中已有这样的享元对象,享元工厂就提供这个享元对象给请求者,否则就创建一个享元对象,添加到散列表中,同时将该享元对象提供给请求者,显然当若干个用户或对象,请求享元工厂提供一个享元对象时,第一个用户获得该享元对象的时间可能慢一些,但是后记的用户会比较快的获得这个对象,可以使用单列模式来设计享元工厂,即让系统中只有一个享元工厂的实例,另外,为了让享元工厂能生成享元对象,需要将具体享元类作为享元工厂的内部类。

享元模式的UML类图:

享元模式的优缺点:
优点:
①使用享元可以节省内存的开销,特别适合处理大量细粒度对象,这些对象的许多属性值是相同的,而且一旦创建则不允许修改;
②享元模式中的享元可以使用方法的参数接受外部的状态中的数据,但外部状态数据不会干扰到享元中的内部数据,这就使享元可以在不同的环境中被共享;
缺点:
①使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序逻辑复杂化;
②为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长。

享元模式的适用情景:
①一个应用程序使用大量的对象,这些对象之间部分属性本质上是相同的,这时应使用享元来封装相同的部分;
②对象的多数状态都可变为外部状态,就可以考虑将这样对象作为系统中的享元来使用;
③使用享元模式需要维护一个存储享元对象的享元池,而这需要耗费资源,因此,应当在多次重复使用享元对象时才值得使用享元模式。

三、王者荣耀角度下实现享元模式结构图及代码

eclipse结构图

主函数【应用(Application)】
Applicayion.java

package angle_flyweightPattern;import angle_flyweightPattern.Hero;
import angle_flyweightPattern.Flyweight;
import angle_flyweightPattern.FlyweightFactroy;public class Application{public static void main(String args[]) {FlyweightFactroy  factroy=FlyweightFactroy.getFactroy();String oneSkill = "静谧之眼",twoSkill = "狂风之息",threeSkill = "逃脱";String key=""+oneSkill+"#"+twoSkill+"#"+threeSkill;Flyweight flyweight=factroy.getFlyweight(key);Hero audiA6One=new Hero(flyweight,"百里守约","特工魅影 ","百穿铭文");Hero audiA6Two=new Hero(flyweight,"百里守约","朱雀志    ","吸血铭文");Hero audiA6Three=new Hero(flyweight,"百里守约","朱雀志    ","吸血铭文");audiA6One.print();audiA6Two.print();audiA6Three.print();Hero audiA4One=new Hero(flyweight,"百里守约","绝影神枪","百穿铭文");Hero audiA4Two=new Hero(flyweight,"百里守约","特工魅影","百穿铭文");flyweight.printMess(" 英雄:百里守约 皮肤:绝影神枪  铭文:百穿铭文"); // 向享元传递外部数据flyweight.printMess(" 英雄:百里守约 皮肤:朱雀志     铭文:百穿铭文");}
} 

Hero.java

package angle_flyweightPattern;import angle_flyweightPattern.Flyweight;public class Hero{Flyweight  flyweight;    //存放享元对象的引用String name,skin,inscription;Hero(Flyweight  flyweight,String name,String skin,String inscription){this.flyweight=flyweight;this.name=name;this.skin=skin;this.inscription=inscription;}public void print(){System.out.print(" 英雄:"+name);System.out.print(" 皮肤:"+skin);System.out.print(" 铭文:"+inscription); System.out.print("  一技能:"+flyweight.getOneSkill());System.out.print("  二技能:"+flyweight.getTwoSkill());System.out.println("  三技能:"+flyweight.getThreeSkill());}
}

享元接口(Flyweight)
Flyweight.java

package angle_flyweightPattern;public interface Flyweight{public String getOneSkill();public String getTwoSkill();public String getThreeSkill();public void printMess(String mess);
}

享元工厂(FlyweightFactory)
FlyweightFactroy.java

package angle_flyweightPattern;import java.util.HashMap;public class FlyweightFactroy{private   HashMap<String,Flyweight>  hashMap;static  FlyweightFactroy factroy=new FlyweightFactroy();private FlyweightFactroy(){hashMap=new HashMap<String,Flyweight>();}public static FlyweightFactroy getFactroy(){return factroy;}public synchronized Flyweight getFlyweight(String key){if(hashMap.containsKey(key))return hashMap.get(key);else{ String oneSkill,twoSkill,threeSkill;String[] str=key.split("#");oneSkill=str[0];twoSkill=str[1];threeSkill=str[2];Flyweight ft=new ConcreteFlyweight(oneSkill,twoSkill,threeSkill);hashMap.put(key,ft);return ft;} }class ConcreteFlyweight implements Flyweight{private String oneSkill;private String twoSkill;private String threeSkill; private ConcreteFlyweight(String oneSkill,String twoSkill,String threeSkill){this.oneSkill=oneSkill;this.twoSkill=twoSkill;this.threeSkill=threeSkill;}public String getOneSkill(){return oneSkill;}public String getTwoSkill(){return twoSkill;}public String getThreeSkill(){return threeSkill;}public void printMess(String mess){System.out.print(mess);        //输出外部数据messSystem.out.print("  一技能:"+oneSkill);  //输出内部数据widthSystem.out.print("  二技能:"+twoSkill);System.out.println("  三技能:"+threeSkill);}}
}

运行结果截图

更多设计模式在王者荣耀中的应用请点击我的→设计模式在王者荣耀中的应用专栏。

欢迎留言,一起学习交流~

感谢阅读

END

在王者荣耀角度下分析面向对象程序设计B中23种设计模式之享元模式相关推荐

  1. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之工厂方法模式

    · 工厂方法模式在王者荣耀中的应用 · 一.简述 王者荣耀这款游戏目前一共有100位英雄,游戏设计师根据英雄技能.属性.天赋等因素,将英雄划分为射手.辅助.打野.法师.坦克.战士等职业. 在本实例中, ...

  2. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之责任链模式

    · 责任链模式在王者荣耀中的应用 · 一.简述 在王者荣耀商城中,玩家可以参与夺宝抽奖.夺宝抽奖分两种,一种是积分抽奖,另一种是钻石抽奖:在平常,两种夺宝抽奖方式均可以通过60钻石/积分抽奖一次,或者 ...

  3. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之原型模式

    · 原型模式在王者荣耀中的应用 · 一.简述 在王者荣耀中,克隆模式算是一个人气比较高的娱乐模式了,因为该模式下双方可以各有五个一模一样的英雄,可以带给玩家不同的游戏体验,特别是有一些比较好玩的英雄, ...

  4. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之策略模式

    · 策略模式在王者荣耀中的应用 · 应用一:[登录游戏前]选择通过何种方式登录游戏 应用二:[游戏开始前]选择英雄及其召唤师技能 应用三:[游戏开始后]选择使用普攻还是技能 一.简述 登录游戏前,玩家 ...

  5. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之备忘录模式

    · 备忘录模式在王者荣耀中的应用 · 一.简述 在王者荣耀的游戏中,贤者的庇护这件装备设计的初衷是提高容错率,常常出现在游戏后期,玩家通过装备贤者的庇护在危急时刻可以实现复活效果,进而保命. 二.备忘 ...

  6. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之组合模式

    · 组合模式在王者荣耀中的应用 · 一.简述 王者荣耀有非常多的英雄,而且每一个不同的英雄也有其自己对应的皮肤.玩家可以根据需要购买不同的英雄皮肤,体验不同英雄皮肤在对局中的感受. 在本实例中,根据组 ...

  7. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之装饰模式

    · 装饰模式在王者荣耀中的应用 · 一.简述 在王者荣耀这款游戏中,英雄在战场上高伤害.高爆发.高移速等是所有玩家共同追求的,那么这些所谓的伤害.移速.穿透力等英雄属性我们可以通过在局外对英雄附带皮肤 ...

  8. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之代理模式

    · 代理模式在王者荣耀中的应用 · 应用一(虚拟代理模式) 应用二(远程代理模式) 应用三(充值送好礼) 一.简述 应用一: 在王者荣耀这款游戏里,设置有很多种娱乐游戏模式,比如:无限乱斗.梦境大乱斗 ...

  9. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之单件模式

    · 单件模式在王者荣耀中的应用 · 一.简述 今年春节王者荣耀出了一个叫做"王者快跑"的限时玩法,许多玩家都很喜欢这个游戏模式.不同于5V5的王者地图,这个地图是一个跑道中途有很多 ...

  10. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之访问者模式

    · 访问者模式在王者荣耀中的应用 · 一.简述 在王者荣耀的社交系统中有2大核心,一为好友系统二为战队系统,好友系统偏向于个人,战队系统偏向于一个集体.玩家可以自己筹备创建战队.亦可加入其他战队.战队 ...

最新文章

  1. IIS7 / IIS7.5 URL 重写 HTTP 重定向到 HTTPS(转)
  2. Hibernate组件(Component)映射
  3. GMIS 2017嘉宾王小川:人工智能技术与应用思考
  4. VBA学习笔记(一):自动添加代码VBA修改注册表
  5. 逻辑回归的总结(详细步骤)
  6. OSPF 多区域配置
  7. 后台系统可扩展性学习笔记(五)负载均衡
  8. GCC中SIMD指令的应用方法
  9. JavaScript——面向对象之继承(原型对象)与多态(重载、重写)
  10. Android 系统(78)---《android framework常用api源码分析》之 app应用安装流程
  11. 北邮数电 爱课堂答案 Verilog专题
  12. Vbs调用MsAgent组件,很有趣
  13. 统计通话次数和时间的软件_通话时间统计app下载-通话时间统计下载v2.3-西西软件下载...
  14. maven使用国内源和使用代理
  15. BZOJ 3162 / Luogu P4895: 独钓寒江雪 树hash+DP
  16. 网络爬虫中Json数据的解析[以时光网为例]
  17. [动态规划] 洛谷P1064 金明的预算方案
  18. 神经网络入门教程,现代神经网络教程
  19. 金融业移动管理驾驶舱产品功能介绍
  20. SAP QM 取消UD方法

热门文章

  1. 宝藏级UI组件库:FirstUI,微信小程序版+uniapp版更新至1.6.0,完美支持vue3
  2. 手把手教你Mac重装系统不再难:苹果电脑重装系统教程
  3. c#轻量级高并发物联网服务器接收程序源码
  4. JavaScript封装对象和类
  5. linux如何卸载anaconda
  6. matlab求最值(极值)
  7. vue、 echarts、iview 实现大数据可视化大屏模板
  8. STLINK 烧写器引脚定义
  9. 个人商业画布学习笔记
  10. 如何从商业模式画布中看到自己的优势?