《Java 工厂模式:一文搞懂,实在不行再来一文》

145 阅读2分钟

以下是一个详细的高级工厂模式(抽象工厂模式)的例子:

一、场景设定

假设我们正在开发一个游戏,游戏中有不同的种族,每个种族都有自己的士兵和建筑物。我们希望能够根据玩家选择的种族,创建出相应种族的士兵和建筑物。

二、具体实现

  1. 定义抽象产品接口
    • 首先定义士兵的抽象接口Soldier:
     public interface Soldier {
         void attack();
     }
  • 再定义建筑物的抽象接口Building:
     public interface Building {
         void function();
     }
  1. 创建具体产品类
    • 对于人类种族,创建人类士兵类HumanSoldier和人类建筑物类HumanBuilding:
     public class HumanSoldier implements Soldier {
         @Override
         public void attack() {
             System.out.println("人类士兵攻击!");
         }
     }
     public class HumanBuilding implements Building {
         @Override
         public void function() {
             System.out.println("人类建筑物发挥作用!");
         }
     }
  • 对于精灵种族,创建精灵士兵类ElfSoldier和精灵建筑物类ElfBuilding:
     public class ElfSoldier implements Soldier {
         @Override
         public void attack() {
             System.out.println("精灵士兵攻击!");
         }
     }
     public class ElfBuilding implements Building {
         @Override
         public void function() {
             System.out.println("精灵建筑物发挥作用!");
         }
     }
  1. 定义抽象工厂接口
   public interface RaceFactory {
       Soldier createSoldier();
       Building createBuilding();
   }
  1. 创建具体工厂类
    • 人类种族工厂HumanFactory:
     public class HumanFactory implements RaceFactory {
         @Override
         public Soldier createSoldier() {
             return new HumanSoldier();
         }
         @Override
         public Building createBuilding() {
             return new HumanBuilding();
         }
     }
  • 精灵种族工厂ElfFactory:
     public class ElfFactory implements RaceFactory {
         @Override
         public Soldier createSoldier() {
             return new ElfSoldier();
         }
         @Override
         public Building createBuilding() {
             return new ElfBuilding();
         }
     }
  1. 客户端使用
   public class Game {
       public static void main(String[] args) {
           // 选择人类种族
           RaceFactory humanFactory = new HumanFactory();
           Soldier humanSoldier = humanFactory.createSoldier();
           Building humanBuilding = humanFactory.createBuilding();
           humanSoldier.attack();
           humanBuilding.function();
           // 选择精灵种族
           RaceFactory elfFactory = new ElfFactory();
           Soldier elfSoldier = elfFactory.createSoldier();
           Building elfBuilding = elfFactory.createBuilding();
           elfSoldier.attack();
           elfBuilding.function();
       }
   }

三、总结

在这个例子中,抽象工厂模式的优点显而易见:

  • 易于扩展:如果要添加新的种族,只需要创建新的具体工厂和具体产品类,而不会影响现有的代码。
  • 解耦性高:客户端代码只依赖于抽象工厂和抽象产品接口,而不关心具体的实现类,这使得代码更加灵活和可维护。