·
抽象工厂模式在王者荣耀中的应用
·
一、简述
王者荣耀QQ端目前有325个区供玩家选择,玩家们可以使用一个QQ号在不同区中登录,而且每个区中的数据由玩家在此区中体验次数、时间的变化而变化。
二、抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式理解:
高度概括:提供一个创建一系列或相互依赖对象的接口,而无需指定它们具体的类。
设计某些系统时,可能需要为用户提供一系列相关的对象,但系统不希望用户直接使用new运算符实化这些对象,而是应当有系统来控制这些对象的创建,否则用户不仅要清楚的知道使用哪些类来创建这些对象,而且还必须要清楚这些对象之间是如何相关的,使得用户的代码和这些类形成紧耦合,缺乏弹性,不利于维护。
当系统准备为用户提供一系列相关的对象,又不想让用户代码和创建这些对象的类形成耦合时,就可以使用抽工厂方法模式来设计系统,抽象工厂模式的关键是在一个抽象类或接口中定义若干个抽象方法,这些抽象方法分别返回某个类的实例,该抽象类或接口让其子类或实现该接口的类重写这些抽象方法为用户提供一系列相关的对象。
抽象工厂模式结构中的四种角色:
①抽象产品(Product):一个抽象类或接口负责定义具体产品必须实现的方法;
②具体产品(ConcreteProduct):具体产品是一个类,如果Product是一个抽象类,那么具体产品是Product的子类;如果Product是一个接口,那么具体产品是实现Product接口的类;
③抽象工厂(AbstractFactory):一个接口或抽象类负责定义若干个抽象方法;
④具体工厂(ConcreteFactory):如果抽象工厂是抽象类,具体工厂是抽象工厂的子类;如果抽象工厂是接口,具体工厂是实现抽象工厂的类。具体工厂重写抽象工厂中的抽象方法 使该方法返回具体产品的实例。
抽象工厂模式的UML类图:
抽象工厂模式的优缺点:
优点:
①抽象工厂模式可以为用户创建一系列相关的对象,使用户和创建这些对象的类脱耦;
②使用抽象工厂模式,可以方便的为用户配置一系列对象,用户使用不同的具体工厂就能得到一组相关的对象,同时也能避免用户混用不同系列中的对象;
③在抽象工厂模式中,可以随时增加具体工厂,为用户提供一组相关的对象;
缺点:
在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
抽象工厂模式的适用情景:
①系统需要为用户提供多个对象,但不希望用户直接使用new运算符实例化这些对象,即希望用户和创建对象的类脱耦;
②系统需要为用户提供多个相关的对象,以便用户联合使用它们,但又不希望用户来决定这些对象是如何关联的;
③系统需要为用户提供一系列对象,但只需要用户知道这些对象有哪些方法可用,不需要用户知道这些对象的创建过程。
三、王者荣耀角度下实现抽象工厂模式结构图及代码
eclipse结构图
主函数【应用(Application)】
Application.java
package angle_abstractFactoryPattern;
import angle_abstractFactoryPattern.ZoneOne;
import angle_abstractFactoryPattern.Zone;
import angle_abstractFactoryPattern.ZoneTwo;
import angle_abstractFactoryPattern.Message;
public class Application{
public static void main(String args[]){
Message message=new Message();
System.out.println("某QQ号在不同区中的全部信息:");
System.out.println(" <手Q273区 制裁神谕>");
Zone zone=new ZoneOne();
message.giveSuit(zone,80,77,47,1314);
System.out.println(" <手Q289区 神梦一刀>");
zone=new ZoneTwo();
message.giveSuit(zone,111,88,56,5200);
}
}
抽象产品
Goods.java
package angle_abstractFactoryPattern;
public abstract class Goods{
public abstract int getHeroNumber();
public abstract int getSkinNumber();
public abstract String getName();
}
MilitaryExploits.java
package angle_abstractFactoryPattern;
public abstract class MilitaryExploits{
public abstract int getTotalNumber();
public abstract int getWinProbability();
public abstract String getName();
}
具体产品
Hero.java
package angle_abstractFactoryPattern;
import angle_abstractFactoryPattern.Goods;
public class Hero extends Goods{
private int heroNumber;
private int skinNumber;
private String name;
Hero(String name,int heroNumber,int skinNumber){
this.name=name;
this.heroNumber=heroNumber;
this.skinNumber=skinNumber;
}
public int getHeroNumber(){
return heroNumber;
}
public int getSkinNumber(){
return skinNumber;
}
public String getName(){
return name;
}
}
Skin.java
package angle_abstractFactoryPattern;
import angle_abstractFactoryPattern.Goods;
public class Skin extends Goods{
private int skinNumber;
private int heroNumber;
private String name;
Skin(String name,int heroNumber,int skinNumber){
this.name=name;
this.skinNumber=skinNumber;
this.heroNumber=heroNumber;
}
public int getHeroNumber(){
return heroNumber;
}
public int getSkinNumber(){
return skinNumber;
}
public String getName(){
return name;
}
}
TotalNumberOfGames.java
package angle_abstractFactoryPattern;
import angle_abstractFactoryPattern.MilitaryExploits;
public class TotalNumberOfGames extends MilitaryExploits{
private int number;
private int probability;
private String name;
TotalNumberOfGames(String name,int number,int probability){
this.name=name;
this.number=number;
this.probability=probability;
}
public int getWinProbability(){
return probability;
}
public int getTotalNumber(){
return number;
}
public String getName(){
return name;
}
}
WinningProbability.java
package angle_abstractFactoryPattern;
import angle_abstractFactoryPattern.MilitaryExploits;
public class WinningProbability extends MilitaryExploits{
private int probability;
private int number;
private String name;
WinningProbability(String name,int number,int probability){
this.name=name;
this.probability=probability;
this.number=number;
}
public int getTotalNumber(){
return number;
}
public int getWinProbability(){
return probability;
}
public String getName(){
return name;
}
}
抽象工厂
Zone.java
package angle_abstractFactoryPattern;
public abstract class Zone{
public abstract MilitaryExploits createMilitaryExploits(int proibility,int number);
public abstract Goods createGoods(int heroNumber,int skinNumber);
}
具体工厂
ZoneOne.java
package angle_abstractFactoryPattern;
import angle_abstractFactoryPattern.MilitaryExploits;
import angle_abstractFactoryPattern.Goods;
public class ZoneOne extends Zone {
public MilitaryExploits createMilitaryExploits(int proibility,int number){
return new TotalNumberOfGames(" 战绩",proibility,number);
}
public Goods createGoods(int heroNumber,int skinNumber){
return new Skin(" 物品",heroNumber,skinNumber);
}
}
ZoneTwo.java
package angle_abstractFactoryPattern;
import angle_abstractFactoryPattern.MilitaryExploits;
import angle_abstractFactoryPattern.Goods;
public class ZoneTwo extends Zone {
public MilitaryExploits createMilitaryExploits(int proibility,int number){
return new TotalNumberOfGames(" 战绩",proibility,number);
}
public Goods createGoods(int heroNumber,int skinNumber){
return new Skin(" 物品",heroNumber,skinNumber);
}
}
其他
Message.java
package angle_abstractFactoryPattern;
public class Message{
Goods goods;
MilitaryExploits exploits;
public void giveSuit(Zone zone,int skinNumber,int heroNumber,int winProbability,int totalNumber){
goods=zone.createGoods(heroNumber,skinNumber);
exploits=zone.createMilitaryExploits(totalNumber,winProbability);
showMess();
}
private void showMess(){
System.out.println(goods.getName()+":");
System.out.println(" 英雄:"+goods.getHeroNumber());
System.out.println(" 皮肤:"+goods.getSkinNumber());
System.out.println(exploits.getName()+":");
System.out.println(" 胜率:"+exploits.getWinProbability()+"%");
System.out.println(" 场数:"+exploits.getTotalNumber());
}
}
运行结果截图
更多设计模式在王者荣耀中的应用请点击我的→设计模式在王者荣耀中的应用专栏
欢迎留言,一起交流学习
感谢阅读