首页 \ 问答 \ 工厂方法模式的优点(Advantage of factory method pattern)

工厂方法模式的优点(Advantage of factory method pattern)

来自维基

Factory Method设计模式解决了以下问题:

  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();
}

阅读答案

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


我的问题是,

工厂方法模式的优点是什么,引入提供模板方法的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(); 
    }
}

From wiki,

The Factory Method design pattern solves problems like:

  1. How can an object be created so that subclasses can redefine which class to instantiate?

  2. How can a class defer instantiation to subclasses?

For example, MazeGame provides the instantiation capability to subclass like MagicMazeGame.

enter image description here

where,

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();
}

Read answer.

Of course, this is a creational pattern, so design should be around simplifying instantiation of a class.


My question is,

What is the advantage of factory method pattern, introducing MagicGame class that provides a template method(public MazeGame(){..}) and defer instantiation to subclass MagicMazeGame or OrdinaryMazeGame?

Is deferring instantiation to subclass for only abstracting the below intricacies in a class like MagicMazeGame,

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

and provide a uniform creation logic in every class MagicMazeGame or class OrdinaryMazeGame, as shown below,

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

原文:https://stackoverflow.com/questions/47938020
更新时间:2022-10-25 16:10

最满意答案

尝试添加以下代替显示块:

@media print
{
     @page {size: landscape}
     #tableContainer {height:100% ;}
     #tablepaging{height:100% ;}
     #tablepaging tr{display: table-row !important;}
}

Try to add following instead of display block:

@media print
{
     @page {size: landscape}
     #tableContainer {height:100% ;}
     #tablepaging{height:100% ;}
     #tablepaging tr{display: table-row !important;}
}

相关问答

更多