interface CharacterFactory { Character createCharacter(); } class WarriorFactory implements CharacterFactory { public Character createCharacter() { return new Warrior(); } } class MageFactory implements CharacterFactory { public Character createCharacter() { return new Mage(); } }
时间: 2024-02-29 15:54:48 浏览: 11
这段代码是关于工厂方法设计模式的实现。它定义了一个CharacterFactory接口和两个具体的工厂类WarriorFactory和MageFactory,它们都实现了CharacterFactory接口,并且实现了createCharacter()方法。这个方法的作用是创建一个角色对象,WarriorFactory创建的是战士对象,MageFactory创建的是法师对象。这个设计模式可以让我们通过工厂类来创建对象,而不是直接在代码中实例化对象。这样做可以使代码更加灵活和可维护。我们可以在需要的时候添加新的工厂类来创建新的对象,而不需要修改已有的代码。
相关问题
利用恰当的设计模式对功能进行设计,简述设计思想,并绘制恰当的UML图进行说明,写出JAVA代码,运行并截图形成文档; 3.项目需求: ①游戏需要支持多种角色,例如战士、法师、刺客等。 ②系统需要对玩家的行为进行验证和处理,例如输入命令、攻击敌人等。 ③在玩家进行某些行为时,需要触发一系列的后续操作,例如扣除体力值、增加经验值等。 ④系统需要提供不同的服务器选择,例如亚洲、欧洲、美洲等。 ⑤玩家可以选择不同的语言和画面设置。
根据需求,我推荐使用以下设计模式:
1. 工厂方法模式:用于创建不同种类的角色。
2. 命令模式:用于实现玩家输入命令和攻击敌人等行为的处理和撤销。
3. 观察者模式:用于实现行为触发后的后续操作,例如扣除体力值、增加经验值等。
4. 抽象工厂模式:用于实现不同的服务器和玩家语言和画面设置的选择。
下面是UML类图和JAVA代码的实现:
![game_design_pattern](https://user-images.githubusercontent.com/45727815/129656869-4e1f05f9-5eed-4a20-8fc5-21fe8da9f6a9.png)
1. 工厂方法模式
```java
public interface CharacterFactory {
Character createCharacter();
}
public class WarriorFactory implements CharacterFactory {
public Character createCharacter() {
return new Warrior();
}
}
public class MageFactory implements CharacterFactory {
public Character createCharacter() {
return new Mage();
}
}
public class AssassinFactory implements CharacterFactory {
public Character createCharacter() {
return new Assassin();
}
}
```
2. 命令模式
```java
public interface Command {
void execute();
void undo();
}
public class AttackCommand implements Command {
private Character attacker;
private Character target;
public AttackCommand(Character attacker, Character target) {
this.attacker = attacker;
this.target = target;
}
public void execute() {
// 处理攻击逻辑
}
public void undo() {
// 撤销攻击逻辑
}
}
public class InputCommand implements Command {
private String input;
public InputCommand(String input) {
this.input = input;
}
public void execute() {
// 处理输入逻辑
}
public void undo() {
// 撤销输入逻辑
}
}
```
3. 观察者模式
```java
public interface Observer {
void update();
}
public class HealthObserver implements Observer {
private Character character;
public HealthObserver(Character character) {
this.character = character;
}
public void update() {
// 处理扣除体力值逻辑
}
}
public class ExperienceObserver implements Observer {
private Character character;
public ExperienceObserver(Character character) {
this.character = character;
}
public void update() {
// 处理增加经验值逻辑
}
}
```
4. 抽象工厂模式
```java
public interface ServerFactory {
Server createServer();
Language createLanguage();
Screen createScreen();
}
public class AsiaServerFactory implements ServerFactory {
public Server createServer() {
return new AsiaServer();
}
public Language createLanguage() {
return new Chinese();
}
public Screen createScreen() {
return new HD();
}
}
public class EuropeServerFactory implements ServerFactory {
public Server createServer() {
return new EuropeServer();
}
public Language createLanguage() {
return new English();
}
public Screen createScreen() {
return new FullHD();
}
}
public class AmericaServerFactory implements ServerFactory {
public Server createServer() {
return new AmericaServer();
}
public Language createLanguage() {
return new Spanish();
}
public Screen createScreen() {
return new UltraHD();
}
}
```
通过以上设计模式的应用,我们可以实现游戏需求并且提高代码的可维护性和可扩展性。
自选题目,适合使用抽象工厂方法模式的场景,并实现。
题目:设计一个游戏角色创建系统,包括角色职业、性别、装备等属性,适合使用抽象工厂方法模式的场景,并实现。
在游戏中,一个角色可以有不同的属性,如职业、性别、装备等,而这些属性的组合会决定角色的战斗能力、外观和其他特性。为了方便创建角色,可以使用抽象工厂方法模式来实现。
首先,需要定义一个抽象接口 `CharacterFactory` 来规定创建角色的方法,包括创建职业、性别和装备的方法。然后,需要定义不同的具体工厂类实现这个接口,如 `WarriorFactory`、`MageFactory` 和 `RogueFactory`,分别用于创建战士、法师和盗贼角色。
每个具体工厂类会实现 `CharacterFactory` 接口中的方法,以创建具有相应属性的角色。例如,`WarriorFactory` 会创建战士角色,包括选择武器、防具和其他装备,设置战斗属性等等。
具体的角色类可以使用模板方法模式来实现,以确保角色的创建过程符合一定的规范和标准。例如,可以定义一个抽象角色类 `Character`,包含 `createCharacter` 模板方法,用于定义创建角色的流程和步骤。
以下是示例代码:
```java
// 抽象工厂接口
public interface CharacterFactory {
public Weapon createWeapon();
public Armor createArmor();
public OtherEquipment createOtherEquipment();
}
// 具体工厂类:战士工厂
public class WarriorFactory implements CharacterFactory {
public Weapon createWeapon() {
return new Sword();
}
public Armor createArmor() {
return new PlateArmor();
}
public OtherEquipment createOtherEquipment() {
return new Shield();
}
}
// 具体工厂类:法师工厂
public class MageFactory implements CharacterFactory {
public Weapon createWeapon() {
return new Staff();
}
public Armor createArmor() {
return new Robe();
}
public OtherEquipment createOtherEquipment() {
return new MagicOrb();
}
}
// 具体工厂类:盗贼工厂
public class RogueFactory implements CharacterFactory {
public Weapon createWeapon() {
return new Dagger();
}
public Armor createArmor() {
return new LeatherArmor();
}
public OtherEquipment createOtherEquipment() {
return new Poison();
}
}
// 抽象装备类
public abstract class Equipment {
public abstract String getName();
}
// 具体装备类:武器
public class Weapon extends Equipment {
public String getName() {
return "Weapon";
}
}
// 具体装备类:防具
public class Armor extends Equipment {
public String getName() {
return "Armor";
}
}
// 具体装备类:其他装备
public class OtherEquipment extends Equipment {
public String getName() {
return "OtherEquipment";
}
}
// 具体武器类:剑
public class Sword extends Weapon {
public String getName() {
return "Sword";
}
}
// 具体武器类:魔杖
public class Staff extends Weapon {
public String getName() {
return "Staff";
}
}
// 具体武器类:匕首
public class Dagger extends Weapon {
public String getName() {
return "Dagger";
}
}
// 具体防具类:板甲
public class PlateArmor extends Armor {
public String getName() {
return "PlateArmor";
}
}
// 具体防具类:魔法袍
public class Robe extends Armor {
public String getName() {
return "Robe";
}
}
// 具体防具类:皮甲
public class LeatherArmor extends Armor {
public String getName() {
return "LeatherArmor";
}
}
// 具体其他装备类:盾牌
public class Shield extends OtherEquipment {
public String getName() {
return "Shield";
}
}
// 具体其他装备类:魔法宝珠
public class MagicOrb extends OtherEquipment {
public String getName() {
return "MagicOrb";
}
}
// 具体其他装备类:毒药
public class Poison extends OtherEquipment {
public String getName() {
return "Poison";
}
}
// 抽象角色类
public abstract class Character {
public abstract void createCharacter();
}
// 具体角色类:战士
public class Warrior extends Character {
private Weapon weapon;
private Armor armor;
private OtherEquipment otherEquipment;
public Warrior(CharacterFactory factory) {
this.weapon = factory.createWeapon();
this.armor = factory.createArmor();
this.otherEquipment = factory.createOtherEquipment();
}
public void createCharacter() {
System.out.println("Creating warrior character with " + weapon.getName() + ", " + armor.getName() + ", and " + otherEquipment.getName());
}
}
// 具体角色类:法师
public class Mage extends Character {
private Weapon weapon;
private Armor armor;
private OtherEquipment otherEquipment;
public Mage(CharacterFactory factory) {
this.weapon = factory.createWeapon();
this.armor = factory.createArmor();
this.otherEquipment = factory.createOtherEquipment();
}
public void createCharacter() {
System.out.println("Creating mage character with " + weapon.getName() + ", " + armor.getName() + ", and " + otherEquipment.getName());
}
}
// 具体角色类:盗贼
public class Rogue extends Character {
private Weapon weapon;
private Armor armor;
private OtherEquipment otherEquipment;
public Rogue(CharacterFactory factory) {
this.weapon = factory.createWeapon();
this.armor = factory.createArmor();
this.otherEquipment = factory.createOtherEquipment();
}
public void createCharacter() {
System.out.println("Creating rogue character with " + weapon.getName() + ", " + armor.getName() + ", and " + otherEquipment.getName());
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
CharacterFactory factory = new WarriorFactory();
Character warrior = new Warrior(factory);
warrior.createCharacter();
factory = new MageFactory();
Character mage = new Mage(factory);
mage.createCharacter();
factory = new RogueFactory();
Character rogue = new Rogue(factory);
rogue.createCharacter();
}
}
```
以上代码中,抽象工厂接口 `CharacterFactory` 定义了创建角色属性的方法,具体工厂类实现了这些方法并创建相应的装备对象。具体角色类使用这些装备对象创建具体的角色。在客户端代码中,可以创建不同的工厂对象来创建不同职业的角色。