工厂方法模式的优势

Advantage of factory method pattern

来自 wiki,

工厂方法设计模式解决了如下问题:

  1. 如何创建一个对象,以便子classes可以重新定义实例化哪个class?

  2. class 如何将实例化延迟到子classes?

例如MazeGameMagicMazeGame.

一样为subclass提供实例化能力

其中,

public abstract class MazeGame {
    private final List<Room> rooms = new ArrayList<>();

    public MazeGame() {
        Room room1 = makeRoom();
        Room room2 = makeRoom();
        room1.connect(room2);
        rooms.add(room1);
        rooms.add(room2);
    }

    abstract protected Room makeRoom();
}

阅读answer

当然,这是一个创建模式,因此设计应该围绕简化 class.

的实例化

我的问题是,

工厂方法模式的优点是什么,引入MagicGameclass提供模板方法(public MazeGame(){..})和延迟实例化子 class MagicMazeGameOrdinaryMazeGame

是否将实例化推迟到子class,以便仅抽象出 class 中的以下复杂性,例如 MagicMazeGame

        Room room1 = MagicMazeGame();
        Room room2 = MagicMazeGame();
        room1.connect(room2);
        rooms.add(room1);
        rooms.add(room2);

并在每个classMagicMazeGame或classOrdinaryMazeGame中提供统一的创建逻辑,如下图,

public class MagicMazeGame extends MazeGame {
    public MagicMazeGame() {
        super();
    } 
    @Override
    protected Room makeRoom() {
        return new MagicRoom(); 
    }
}

使用工厂方法模式的优势在于,您可以将创建 class 的业务逻辑与 class 的实际逻辑分离,因为如果您没有该工厂方法,您在系统中添加的每个 class 都需要在内部有一个工厂方法,并且当您必须更改有关创建的某些内容时,您可能必须处理所有那组 classes (不利于开闭原则)