【问题标题】:Advantage of factory method pattern工厂方法模式的优势
【发布时间】:2017-12-22 08:16:03
【问题描述】:

来自wiki

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

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

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

例如,MazeGame 提供了像MagicMazeGame 这样的子类的实例化能力。

在哪里,

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

当然,这是一种创建模式,因此设计应该围绕简化类的实例化。


我的问题是,

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

将实例化推迟到子类仅用于抽象类中的以下复杂性,例如 MagicMazeGame

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

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

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

【问题讨论】:

    标签: java oop design-patterns factory-method open-closed-principle


    【解决方案1】:

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

    【讨论】:

    • 因此,为避免更改所有该组MagicMazeGameOrdinaryMazeGame 中的创建逻辑,使用工厂方法public MazeGame(){}
    • 正如你所说:改变一些关于创作的东西,wiki 也是这么说的,这使得“新”操作符变得多余,允许遵守开放/封闭原则使最终产品在发生变化时更加灵活。
    • 没错,只要你能尽量避免使用新的关键字
    • Java 用户,这种模式在 Java SE 或 Java EE 或 Spring 中是否使用过?
    • Spring 经常使用 bean
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多