工厂方法模式的优点(Advantage of factory method pattern)
来自维基 ,
Factory Method设计模式解决了以下问题:
如何创建对象以便子类可以重新定义要实例化的类?
类如何将实例化推迟到子类?
例如,
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(){..}
)并将实例化推迟到子类MagicMazeGame
或OrdinaryMazeGame
?将实例化推迟到子类只是为了抽象类
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:
How can an object be created so that subclasses can redefine which class to instantiate?
How can a class defer instantiation to subclasses?
For example,
MazeGame
provides the instantiation capability to subclass likeMagicMazeGame
.
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 subclassMagicMazeGame
orOrdinaryMazeGame
?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 classOrdinaryMazeGame
, as shown below,public class MagicMazeGame extends MazeGame { public MagicMazeGame() { super(); } @Override protected Room makeRoom() { return new MagicRoom(); } }
原文:https://stackoverflow.com/questions/47938020
最满意答案
尝试添加以下代替显示块:
@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;} }
相关问答
更多-
尝试这个: function toggle_{{ capability }}() { var table, td, i; table = document.getElementById("myTable"); td = table.getElementsByClassName("div_{{ capability }}"); // Loop through all table rows, and hide those who don't match the search query i ...
-
不确定这是否能解答您的问题,但您可以将样式表加载到打印视图中,也可以设置display: none; 元素。 这是我使用的功能: function print() { var popup = window.open('', 'print', 'height=600,width=700,scrollbars=yes'); popup.document.write('
TITLE '); var printStylePath = '/Co ... -
好吧,似乎没有人对此有任何意见,但我决定使用表单发布方法和隐藏字段继续前进。 这里可以看到一个很好的例子: 发布到javascript并动态创建隐藏字段 该链接指向其他人的问题的答案更新:为了实际解决我的问题,我不得不最终使用window.opener所以下面的链接更多关于我的想法,而不是上面的内容: 开窗器解决方案 (该链接指向其他人的问题的答案) Well nobody seems to have input on this yet but Ive decided to move forward usi ...
-
将逻辑与视图混合是不好的做法。 尝试使用现有组件来显示表。 您可以选择displayTag: http : //www.displaytag.org/1.2/或datatables https://datatables.net/或许多其他人。 使用带有ajax调用的服务器端处理来显示下一条记录。 I solved this problem by creating the table dynamically just using > document.getElementById.style.display ...
-
尝试添加以下代替显示块: @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 ...
-
在表中显示隐藏的行(Showing Hidden Row in Table)[2023-10-14]
这段代码: $("a[id^=show_]") 为每个现有链接以及新链接添加一个新的事件处理程序,因为它不是特定于ID /上下文的,因此所有显示都与选择器匹配。 您需要添加上下文( newRow )或使用现有变量作为已定义的循环的一部分,例如: $("a[id^=show_]", newRow) $("a#show_" + index) (或任何其他有效的变化)。 另一种方法是使用偶数委托来动态添加元素,例如: $(document).on("click", "a[id^=show_]", functi ... -
演示: http : //jsfiddle.net/nEh89/31/ (下面的代码)
Foo Bar Rab