·

单件模式在王者荣耀中的应用

·

一、简述

今年春节王者荣耀出了一个叫做“王者快跑”的限时玩法,许多玩家都很喜欢这个游戏模式。不同于5V5的王者地图,这个地图是一个跑道中途有很多的障碍物,还有NPC玩家释放控制技能做阻拦,简单益智,只要一直跑就可以了,最终按照所有玩家到达终点的时间前后顺序获得名次。

☞在本实例中,设计了一个Champion冠军单件类,以及马超、韩信、猪八戒、李白、李元芳等五个线程,每个线程从左至右移动一个属于自己的按钮(表示玩家操纵各自英雄在全程中的位置),最先移动到终点的按钮即为冠军。
☞按照这一思路,最先到达终点的线程将负责创建出Champion单件类的唯一实例(冠军),其他将自己的按钮移动到指定位置的其他四个线程都可以看到冠军的有关信息及看到Champion单间类的唯一实例的有关属性值。

二、单件模式(Singleton Pattern)

单件模式理解:
高度概括:保证一个类有一个实例,并提供一个访问他的全局访问点。
在某些情况下,我们可能需要某个类只能创建出一个对象,即不让用户用该类实例化出多余两个的实例。
单件模式是关于怎样设计一个类,并使该类只有一个实例的成熟模式,该模式的关键是将类的构造方法设置为private权限,并提供一个返回他的唯一实例的类的方法(static方法)。

单件模式结构中的角色:
单件模式的结构非常简单,只包括一种角色,单件类,单件类只可以创建出一个实例。

单件模式的UML类图:

单件模式的设计特点:
①单件类中包含用自身声明的类变量,这个类变量是单件类唯一的实例;
②单件类的构造方法,访问权限是private,为了确保单件类种自身声明的类变量,是单件类,唯一的实例单件类必须将构造方法,访问权限设置成private,这样一来,任何其他类都无法使用单件类来创建对象;
③单件类负责创建自己唯一的实例,并提供访问该实例的类的方法,由于单件类的构造方法被设置为private,所以单件类必须自己负责,创建自身声明的实力,为了让用户使用单件类这一唯一实例,单件类必须提供一个类方法,以便其他用户使用单件类的类名就可以调用这个类方法访问使用单件类这一唯一实例。

单件模式的优缺点:
优点:

①单件类的唯一实例由单件类本身控制,所以可以很好的控制用户何时访问他(灵活性);
②实例控制,单例模式会阻止其他对象实例化气自己的单例对象的副本,从而确保所有对象都访问唯一实例。
缺点:
①每次对象请求引用时都要检查是否存在类的实例,将需要一些开销,不过可以通过静态初始化解决此问题。
②可能的开发混淆,使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不可能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。

单件模式的适用情景:
当系统需要某一类只能有一个实例

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

eclipse结构图

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

package angle_singletonPattern;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;public class Application extends JFrame implements ActionListener{JButton  start;Player playerOne,playerTwo,playerThree,playerFore,playerFive;JButton  one,two,three,fore,five;JTextField showLabel;int width=60;int height=28;int MaxDistance=460;public Application(){setLayout(null);start=new JButton("开始比赛");start.addActionListener(this);add(start);start.setBounds(200,30,90,20);showLabel=new JTextField("为所有选手加油!");showLabel.setEditable(false);add(showLabel);showLabel.setBounds(50,30,140,20);showLabel.setBackground(Color.orange);showLabel.setFont(new Font("隶书",Font.BOLD,16));showLabel=new JTextField("第一名是谁让我们拭目以待!");showLabel.setEditable(false);add(showLabel);showLabel.setBounds(300,30,230,20);showLabel.setBackground(Color.orange);showLabel.setFont(new Font("隶书",Font.BOLD,16));one=new JButton("马超"); one.setSize(73,30);one.setBackground(Color.yellow); playerOne=new Player(18,2,MaxDistance,one,width,height,showLabel);two=new JButton("韩信"); two.setSize(73,30); two.setBackground(Color.cyan);playerTwo=new Player(18,2,MaxDistance,two,width,height,showLabel);three=new JButton("猪八戒");three.setSize(73,30);three.setBackground(Color.green); playerThree=new Player(18,2,MaxDistance,three,width,height,showLabel);fore=new JButton("李白"); fore.setSize(73,30); fore.setBackground(Color.white);playerFore=new Player(18,2,MaxDistance,two,width,height,showLabel);five=new JButton("李元芳"); five.setSize(73,30); five.setBackground(Color.pink);playerFive=new Player(18,2,MaxDistance,two,width,height,showLabel);initPosition();setBounds(100,100,600,300);setVisible(true);setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);}private void  initPosition(){Champion.initChampion();showLabel.setText("为所有选手加油!");showLabel.setText("第一名是谁让我们拭目以待!");repaint();remove(one);remove(two);remove(three) ;remove(fore);remove(five) ;add(one);add(two);add(three);add(fore);add(five);one.setLocation(1,60);two.setLocation(1,60+height+2);three.setLocation(1,60+2*height+4);fore.setLocation(1,60+3*height+2);five.setLocation(1,60+4*height+3);}public void actionPerformed(ActionEvent e){boolean boo=playerOne.isAlive()||playerTwo.isAlive()||playerThree.isAlive()||playerFore.isAlive()||playerFive.isAlive();if(boo==false){initPosition();int m=(int)(Math.random()*2)+19;playerOne=new Player(m,2,MaxDistance,one,width,height,showLabel);m=(int)(Math.random()*3)+18;playerTwo=new Player(m,2,MaxDistance,two,width,height,showLabel);m=(int)(Math.random()*4)+17;playerThree=new Player(m,2,MaxDistance,three,width,height,showLabel);m=(int)(Math.random()*5)+16;playerFore=new Player(m,2,MaxDistance,fore,width,height,showLabel);m=(int)(Math.random()*6)+15;playerFive=new Player(m,2,MaxDistance,five,width,height,showLabel);}try{playerOne.start();playerTwo.start();playerThree.start();playerFore.start();playerFive.start();}catch(Exception exp){}}public void paint(Graphics g){super.paint(g);g.drawLine(MaxDistance,0,MaxDistance,MaxDistance);}public static void main(String args[]){new Application();}
}

Player.java

package angle_singletonPattern;import angle_singletonPattern.Champion;import javax.swing.JButton;
import javax.swing.JTextField;
public class Player extends Thread{int MaxDistance;int stopTime,step;JButton com;JTextField showMess;Champion champion;Player(int stopTime,int step,int MaxDistance,JButton com,int w,int h,JTextField showMess){this.stopTime=stopTime;this.step=step;this.MaxDistance=MaxDistance;this.com=com;this.showMess=showMess;}public void run(){while(true){int a=com.getBounds().x;int b=com.getBounds().y;if(a+com.getBounds().width>=MaxDistance){champion=Champion.getChampion(com.getText());showMess.setText(champion.getMess());return;}a=a+step;com.setLocation(a,b);try{sleep(stopTime);}catch(InterruptedException exp){}}}
}

单件类
Champion.java

package angle_singletonPattern;import angle_singletonPattern.Champion;public class Champion  {private  static Champion  uniqueChampion;String  message;private Champion(String message){uniqueChampion=this;this. message=message;}     public static synchronized Champion getChampion(String message){   //这是一个同步方法if(uniqueChampion==null){uniqueChampion=new Champion("恭喜"+message+"获得第一名");}return uniqueChampion;}public static void initChampion(){uniqueChampion=null;}public String getMess(){return message;}
}

运行结果截图

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

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

感谢阅读

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种设计模式之访问者模式

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

最新文章

  1. python从入门到精通视频教程百度云-python从入门到精通视频教程百度云资源
  2. arm rtx教程_ARM CMSIS标准概述及快速入门
  3. 新买的衣服一定要洗吗?不洗就穿对身体不好吗?
  4. 实现树状图_举个栗子!Tableau 技巧(132):用参数操作实现数据下钻
  5. 易筋SpringBoot 2.1 | 第三十篇:SpringBoot Reactor响应式编程介绍
  6. [OpenAirInterface实战-13] :OAI 基站配置文件详解
  7. golang-亚马逊s3上传图片文件
  8. 2021年南京天印中学高考成绩查询,2021年南京重点高中名单及排名,南京高中高考成绩排名榜...
  9. 金庸在浙江大学招博士生的考卷
  10. SF58-ASEMI快恢复二极管SF58的发展意义
  11. 测试 必用 工具(测试工具知多少)
  12. 国家自然科学基金 计算机视觉,【科研新成果】我院2019年国家自然科学基金项目取得新突破...
  13. [寻本溯源]“三羊开泰”的典故
  14. 搜索引擎关键字智能提示实践
  15. 人生其实就好象一罐煤气
  16. 简述电信运营商圈内的三大业务领域-B-M-O
  17. mysql %u_mysql 常用
  18. 办公技巧:局域网内设置固定ip
  19. python打开浏览器怎么写_python实现随机调用一个浏览器打开网页
  20. WordPress主题制作全过程(五):制作header.php

热门文章

  1. 日语学习笔记(五十音图篇)
  2. 最牛逼:java动态的填充excel和java操作Excel复选框和单选框
  3. Linux之用户高级管理
  4. int 3中断与软件调试
  5. android无线打印设置纸张和朝向
  6. Redis的n种妙用,分布式锁,分布式唯一id
  7. 查询准考证电脑上显示暂无信息
  8. C++中getc与putc的操作的切换
  9. 计算机应用2010操作题,计算机应用基础Excel2010综合测试操作步骤参考自测题步骤.doc...
  10. DataStage作业开发步骤