关于java:工厂方法模式的优点

Advantage of factory method pattern

从wiki,

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

  • 如何创建对象以便子类可以重新定义要实例化的类?

  • 类如何将实例化推迟到子类?

  • 例如,MazeGameMagicMazeGame等子类提供了实例化功能。

    enter image description here

    哪里,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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();
    }

    阅读答案。

    当然,这是一个创造性的模式,所以设计应该围绕简化类的实例化。

    我的问题是,

    工厂方法模式的优势是什么,引入提供模板方法(public MazeGame(){..}MagicGame类,并将实例化推迟到MagicMazeGameOrdinaryMazeGame子类?

    将实例化推迟到子类,只为了抽象像EDOCX1[1]这样的类中的以下复杂性,

    1
    2
    3
    4
    5
            Room room1 = MagicMazeGame();
            Room room2 = MagicMazeGame();
            room1.connect(room2);
            rooms.add(room1);
            rooms.add(room2);

    并在每个类MagicMazeGame或类OrdinaryMazeGame中提供统一的创建逻辑,如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class MagicMazeGame extends MazeGame {
        public MagicMazeGame() {
            super();
        }
        @Override
        protected Room makeRoom() {
            return new MagicRoom();
        }
    }

    使用工厂方法模式的好处在于,将创建类的业务逻辑与实际的类逻辑分离开来,因为如果没有工厂方法,则系统中添加的每个类都需要有一个工厂方法,当必须更改有关创建的某些内容时,您可能需要EAL与所有这些类集(不利于开闭原则)