我試圖描述(舉例),以獲得澄清周圍的工廠模式在這裏: http://www.oodesign.com/factory-pattern.html與抽象工廠模式澄清後
當我嘗試實施「類註冊,而不反思」例如我得到一個空指針例外。這是一樣的已經在這裏描述:
factory method pattern with class registration produces a nullpointer exception
我明白爲什麼我得到空指針異常(HashMap中沒有被正在使用它的時候填充),我知道我可以修復它通過使用class.forName中的主要或在工廠執行的靜態塊中。
但是這並沒有打破使用這種模式的目的?我認爲這個想法是,創建的對象進行了註冊 - 如果您不得不手動加載類來強制靜態塊運行,那麼這是否違反了打開關閉原則?
下面是示例代碼:
Main.java
public class Main {
public static void main(String[] args) {
Widget widgetA = WidgetFactory.getInstance().createWidget("WidgetA");
Widget widgetB = WidgetFactory.getInstance().createWidget("WidgetB");
widgetA.doSomething();
widgetB.doSomething();
}
}
Widget.java
public abstract class Widget {
protected abstract Widget createWidget();
public abstract void doSomething();
}
WidgetFactory.java
public class WidgetFactory {
private static WidgetFactory instance;
public static synchronized WidgetFactory getInstance() {
if (instance == null) {
instance = new WidgetFactory();
}
return instance;
}
private HashMap<String, Widget> widgets = new HashMap<>();
public void registerWidget(String id, Widget widget) {
widgets.put(id, widget);
}
public Widget createWidget(String id) {
Widget widget = widgets.get(id).create();
return widget;
}
}
WidgetA.java
public class WidgetA extends Widget {
static {
WidgetFactory.getInstance().registerWidget("WidgetA", new WidgetA());
}
@Override
protected Widget createWidget() {
return new WidgetA();
}
@Override
public void doSomething() {
System.out.println("WidgetA");
}
}
WidgetB.java
public class WidgetB extends Widget {
static {
WidgetFactory.getInstance().registerWidget("WidgetB", new WidgetB());
}
@Override
protected Widget createWidget() {
return new WidgetB();
}
@Override
public void doSomething() {
System.out.println("WidgetB");
}
}
正如前面提到的,要得到它的工作,我可以把這個在主或WidgetFactory類:
static {
try {
Class.forName(WidgetA.class.getName());
Class.forName(WidgetB.class.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace(System.err);
}
}
而且也可能有人請澄清應該如何實現這種模式或共享一種技術來使這種模式工作,而不必在每次添加新的Widget子類時更新Main或WidgetFactory類?
謝謝你的幫助!
查閱這些教程,他們幫助了我很多:[1](https://www.youtube.com/watch?v=ub0DXaeV6hA)] [[2](https://開頭WWW。 youtube.com/watch?v=xbjAsdAK4xQ)] –
小部件名稱是否總是與類名相同? – mmirwaldt
@MDD感謝您的鏈接。這些教程是有用的,但沒有解決我的具體問題 - 在教程中,我試圖避免在工廠類中使用if/else if/else結構。 – user2551913