- 目的 :定义一个创建对象的接口,但让子类决定实例化哪个类。工厂方法使类的实例化延迟到子类。
- 核心 :抽象创建者类定义工厂方法,具体创建者子类实现该方法创建具体产品。
- 场景 :框架或库中的可扩展组件,UI 组件库(跨平台 UI 控件),游戏开发(不同敌人/NPC 生成)。
首先定义一个抽象类
java
public abstract class MazeGame{ //迷宫游戏
// 具体的实现延迟到子类
public abstract Maze MakeMaze(); // 创建"迷宫壳"的抽象方法
public abstract Room MakeRoom(int number); // 创建房间的抽象方法
public abstract Door MakeDoor(Room r1, Room r2); // 创建门的抽象方法
public abstract Wall MakeWall(); // 创建墙的抽象方法
public Maze CreateMaze() { //创建迷宫
Maze maze = MakeMaze();
Room r1 = MakeRoom(1);
Room r2 = MakeRoom(2);
Door door = MakeDoor(r1, r2);
Wall wall = MakeWall();
maze.AddRoom(r1);
maze.AddRoom(r2);
r1.SetSide(Direction.East, door);
r1.SetSide(Direction.South, wall);
r1.SetSide(Direction.West, wall);
r1.SetSide(Direction.North, wall);
r2.SetSide(Direction.East, wall);
r2.SetSide(Direction.South, wall);
r2.SetSide(Direction.West, door);
r2.SetSide(Direction.North, wall);
return maze;
}
}
然后在子类中覆写父类的抽象方法
java
public class BombedMazeGame extends MazeGame { //爆炸迷宫游戏
public BombedMazeGame() { }
@Override
public Maze MakeMaze() {
return new Maze();
}
@Override
public Room MakeRoom(int number) {
return new RoomWithABomb(number); //创建会爆炸的房间
}
@Override
public Wall MakeWall() {
return new BombedWall(); //创建会爆炸的墙
}
@Override
public Door MakeDoor(Room r1, Room r2) {
return new Door(r1, r2);
}
}
最后在主函数中调用
java
public class MainTest {
public static void main(String[] args) {
MazeGame game = new BombedMazeGame(); //实例化爆炸迷宫游戏
Maze aMaze = game.CreateMaze(); //创建爆炸迷宫
System.out.println("爆炸主题迷宫建造完成" );
aMaze.getRoom(1).Enter();
}
}
这是类图
