以下是一个详细的高级工厂模式(抽象工厂模式)的例子:
一、场景设定
假设我们正在开发一个游戏,游戏中有不同的种族,每个种族都有自己的士兵和建筑物。我们希望能够根据玩家选择的种族,创建出相应种族的士兵和建筑物。
二、具体实现
- 定义抽象产品接口
-
- 首先定义士兵的抽象接口Soldier:
public interface Soldier {
void attack();
}
- 再定义建筑物的抽象接口Building:
public interface Building {
void function();
}
- 创建具体产品类
-
- 对于人类种族,创建人类士兵类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("精灵建筑物发挥作用!");
}
}
- 定义抽象工厂接口
public interface RaceFactory {
Soldier createSoldier();
Building createBuilding();
}
- 创建具体工厂类
-
- 人类种族工厂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();
}
}
- 客户端使用
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();
}
}
三、总结
在这个例子中,抽象工厂模式的优点显而易见:
- 易于扩展:如果要添加新的种族,只需要创建新的具体工厂和具体产品类,而不会影响现有的代码。
- 解耦性高:客户端代码只依赖于抽象工厂和抽象产品接口,而不关心具体的实现类,这使得代码更加灵活和可维护。