Про Factory Pattern не расскажу, т.к. не работал с дженериками, а вот про "каст" могу пояснить:
Допустим у нас есть TabBar с несколькими табами tab1, tab2, tab3
1. Делаем абстрактный класс а в нем энумом перечисляем каждую табу, в этих табах нап понадобится локатор (что бы кликнуть и открыть таб) ну и наверное самое название таба ... может и еще что нить :) . Каждая таба - будет отдельным классом и соотвественно на ней будет разная "начинка"
public abstract class TabBase {
public static enum Tabs {
TAB1("css=.tab1 > a", "Tab1Name"), TAB2("css=.tab2", "Tab2Name"), TAB3("css=.tab3", "Tab1Name");
private String tabLocator;
private String tabName;
private Tabs(String tabLocator, String tabName) {
this.tabLocator = tabLocator;
this.tabName = tabName;
}
public String getTabLocator() {
return tabLocator;
}
public String getTabName() {
return tabName;
}
};
public TabBase(){
//какое-то тело конструктора + проверки ... если надо
}
//тут какие нить общие методы для табов
abstract Tabs getCurrentTab();
public String getTabName(){
return = getCurrentTab().getTabName();
}
// и т.д.
}
2. Дальше реализуем классы для каждой табы, все они "экстендят" абстрактный класс
public class Tab1 extends TabBase {
public OtherHotelsTab(){
super();
}
@Override
Tabs getCurrentTab() {
return Tabs.OTHER_HOTELS;
}
// ну и т.д. одним словом всё что надо =)
}
3. Т.к. у вас POM то в классе странице, на которой находятся эта tabBar реализуем метод аля
public AccommodationTabBase openTab(Tabs tab){
new Element(tab.getTabLocator()).click();
switch (tab) {
case TAB1:
currentTab = new Tab1();
break;
case TAB2:
currentTab = new tab2();
break;
case TAB3:
currentTab = new Tab3();
break;
default:
throw new InvalidParameterException("Incorrect tab name.");
}
return currentTab;
}
т.е. какую бы мы табу не открыли , нам всегад вернутся базовый абстратный класс табы, далее этот класс кастуется до нужной табы. (Tab3)openTab(TAB3).doЧТО_ТО()
За хардкод локаторов и констант - не ругайте - это всё для примера. И это не сакмая лучшая реализация, но то что смог набрасать на коленке :)