Если есть интерфейс DrawPanel
, то можно будет использовать фабричный шаблон:
public class DrawPanelFactory() {
public DrawPanel create(int whichTypeOfPanel) {
if (whichTypeOfPanel == 1) {
return new DrawPanel1();
}
...
if (whichTypeOfPanel == 12) {
return new DrawPanel12();
}
throw new IllegalArgumentException("Unsupported panel type:" + whichTypeOfPanel);
}
}
В итоге получается много if
утверждений, но все же легко проверяемых. Чтобы избежать операторов if
, используйте статический Map<Integer, DrawPanelFactoryDelegate>
, чтобы связать определенное целочисленное значение с определенной фабрикой, которая знает, как создать этот конкретный тип DrawPanel
:
public class DrawPanelFactory() {
private static Map<Integer, DrawPanelFactoryDelegate> drawPanelFactories = new ...;
static {
drawPanelFactories.put(1, new DrawPanelFactory1());
...
drawPanelFactories.put(12, new DrawPanelFactory12());
}
public DrawPanel create(int whichTypeOfPanel) {
DrawPanelFactoryDelegate delegateFactory = drawPanelFactories.get(whichTypeOfPanel);
if (delegateFactory != null) {
return delegateFactory .create();
}
throw new IllegalArgumentException("Unsupported panel type:" + whichTypeOfPanel);
}
}
interface DrawPanelFactoryDelegate {
public DrawPanel create();
}
DrawPanel1Factory implements DrawPanelFactoryDelegate {
public DrawPanel create() {
return DrawPanel1();
}
}
...
DrawPanel12Factory implements DrawPanelFactoryDelegate {
public DrawPanel create() {
return DrawPanel12();
}
}
затем используется:
DrawPanelFactory drawPanelFactory = new DrawPanelFactory();
DrawPanel aDrawPanel = drawPanelFactory.create(1);
...
DrawPanel yetAnotherDrawPanel = drawPanelFactory.create(12);