Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在初始化之前更改单例模式_Java_Design Patterns_Initialization_Switch Statement - Fatal编程技术网

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();