Java 如何在初始化之前更改单例模式
//在这里,我希望允许玩家在下面的单例类初始化之前选择武器。让玩家玩他们的枪,而不是在整个游戏中改变它Java 如何在初始化之前更改单例模式,java,design-patterns,initialization,switch-statement,Java,Design Patterns,Initialization,Switch Statement,//在这里,我希望允许玩家在下面的单例类初始化之前选择武器。让玩家玩他们的枪,而不是在整个游戏中改变它 public class PlayerSingleton { private static PlayerSingleton player; private String playerName; private Weapon weapon; Weapon stockMP5 = new MP5Weapon(); //Making a new weapon called s
public class PlayerSingleton {
private static PlayerSingleton player;
private String playerName;
private Weapon weapon;
Weapon stockMP5 = new MP5Weapon(); //Making a new weapon called stockMP5 from MP5weapon Class
Weapon sniper = new SniperRifleWeapon(); //Making a new weapon called sniper from SniperRifleWeapon Class
Weapon shotgun = new ShotgunWeapon(); //Making a new weapon called shotgun from Shotgun Class
private PlayerSingleton(Weapon weapon, String pN) {
this.weapon = weapon;
playerName = pN;
}
public void chooseWeapon(String choice) {
switch (choice) {
case "MP5":
weapon = new MP5Weapon();
break;
case "Sniper":
weapon = new SniperRifleWeapon();
break;
case "Shotgun":
weapon = new ShotgunWeapon();
break;
default:
System.out.println("No Attachment found!");
}
}
public static PlayerSingleton getInstance(Weapon choice, String n) {
System.out.println("Choose Weapon to play the with: ");
在初始化playerSingleton getInstance方法之前,如何允许玩家选择武器
任何帮助都将不胜感激
编辑:
if (player == null) {
player = new PlayerSingleton(choice, n);
}
return player;
}
public void chosenWeapon() {
System.out.println(weapon.getDescription()
+ " Weight of Player: " + playerName + " gun: " + weapon.weight() + " base damage: " + weapon.damage());
}
public void addBasicAttachment(String attachment) {
switch (attachment) {
case "sight":
weapon = new BasicSight(weapon);
break;
case "silencer":
weapon = new BasicSilencer(weapon);
break;
case "stock":
weapon = new BasicStock(weapon);
break;
default:
System.out.println("No Attachment found!");
}
}
public void addGoodAttachment(String attachment) {
switch (attachment) {
case "sight":
weapon = new GoodSight(weapon);
break;
case "silencer":
weapon = new GoodSilencer(weapon);
break;
case "stock":
weapon = new GoodStock(weapon);
break;
default:
System.out.println("No Attachment found!");
}
}
public void addGreatAttachment(String attachment) {
switch (attachment) {
case "sight":
weapon = new GreatSight(weapon);
break;
case "silencer":
weapon = new GreatSilencer(weapon);
break;
case "stock":
weapon = new GreatStock(weapon);
break;
default:
System.out.println("No Attachment found!");
}
}
主要问题:
public static Weapon chooseWeapon(String choice) {
switch (choice) {
case "MP5":
return new MP5Weapon();
case "Sniper":
return new SniperRifleWeapon();
case "Shotgun":
return new ShotgunWeapon();
default:
return null;
}
}
public static PlayerSingleton getInstance(String choice, String n) {
System.out.println("Choose Weapon to play the with: ");
Weapon weapon = PlayerSingleton.chooseWeapon(choice);
if (player == null) {
player = new PlayerSingleton(weapon, n);
}
return player;
}
附加编辑:
武器类
Scanner scanner = new Scanner(System.in);
System.out.println(" ------------------------------------ ");
System.out.println(" Text based Shooting Game ");
System.out.println(" ------------------------------------ ");
System.out.println("Please Enter your name before Beginning*");
String name = scanner.next();
System.out.println("Thank you for joining this Adventure " +name);
Weapon weapon = PlayerSingleton.chooseWeapon(name);
PlayerSingleton player = PlayerSingleton.getInstance("MP5",name);
player.chosenWeapon();
更干净的方法是使
chooseWeapon
方法保持静态,并返回武器:
public abstract class Weapon {
String description = "Unknown Weapon: ";
public String getDescription(){
return description;
}
//public abstract int bulletCount();
public abstract double weight();
public abstract double damage();
}
然后在getInstance
上执行以下操作:
public static Weapon chooseWeapon(String choice) {
switch (choice) {
case "MP5":
return new MP5Weapon();
case "Sniper":
return new SniperRifleWeapon();
case "Shotgun":
return new ShotgunWeapon();
default:
System.out.println("No Attachment found!");
return null;
}
}
对getInstance的调用:
public static PlayerSingleton getInstance(String choice, String n) {
Weapon weapon = PlayerSingleton.chooseWeapon(choice);
if (player == null) {
player = new PlayerSingleton(weapon, n);
}
return player;
}
所以一个问题是为什么你希望你的球员是单身?玩家对象应该用游戏对象初始化,这样你就不需要说“新”玩家了 现在,如果你正在重新生成播放器并创建一个新的实例,你应该考虑在播放器类中添加一个“重置”方法。 如果你必须做“单身”: 就选择武器的常规而言,将其委托给另一个类别“武器工厂”会更干净。静态方法可能是一种短期方法,如果你有自动测试,那么测试和存根是一件痛苦的事情(猜这些通常不是在编写游戏时编写的?):P 现在,当你有一个武器工厂时,你可以有一个武器选择器类,在试图获取玩家的实例之前,它会提示用户并调用所需的工厂(或方法)来创建一个“武器” 实际上:如果你不在玩家类中编写“setarmon”方法,你将达到不允许更改玩家武器的目标,除非玩家对象被创建并再次与游戏关联
System.out.println("Choose Weapon to play the with: ");
String choice = scanner.next();
PlayerSingleton player = PlayerSingleton.getInstance(choice, name);
player.chosenWeapon();