Привет, вообщем немного заплутался из правильным дизайном. Опишу идею в двух словах: есть 8 видов XML файлов, система принимает на вход каждый из файлов и использует свою стратегию для сохранения файла в базу данных. Приблизительно это виглядит следующим образом: 1). статичная фабрика для вытагивания нужной стратегии сохранения в базу данных:
Код | public class XMLSaveStrategy { private static Map<String, XMLConcreteStrategy> map = new HashMap<String, XMLConcreteStrategy>();
public static Map<String, XMLConcreteStrategy> getStrategyMap(EntityManager entityManager){ if (map.isEmpty()){ AbstractXMLServiceStrategy<XMLObject> xmlSaveStrategy1 = new ConcreteXMLSaveStrategy1(entityManager); map.put("com.my.app.XMLObject", xmlSaveStrategy1); ... // и т.д. для всег других видов XML } } }
|
2). Сама стратегия:
Код | public abstract AbstractXMLServiceStrategy<T extends XMLObject>{ // фасады имеют операции по хранению разных частей XML, эти операции одинаковые для всех ХМL private ServiceFacade1 serviceFacade1;
protected ServiceFacade1 getServiceFacade1(){ return serviceFacade1; } protected ServiceFacade1 setServiceFacade1(ServiceFacade1 serviceFacade1){ this.serviceFacade1 = serviceFacade1; } private ServiceFacade2 serviceFacade2; protected ServiceFacade2 getServiceFacade2(){ return serviceFacade1; } protected ServiceFacade2 setServiceFacade1(ServiceFacade2 serviceFacade2){ this.serviceFacade2 = serviceFacade2; }
public abstract void saveXML(T XMLObject);
}
public class ConcreteXMLSaveStrategy1 extends AbstractXMLServiceStrategy<XMLConcreteObject1>{ public void saveXML(XMLConreteObject1 xmlObject){ getServiceFacade1().doSomething(); getServiceFacade2().doSomething();
// вызвать другие операции
}
}
|
3. Ну и запускается это дело следующим образом:
Код | // Для каждого XML public void save(XMLObject xmlObject){ ServiceFacade1 serviceFacade1 = ServiceFactory.getInstance().getSerficeFacade1(entityManager); ServiceFacade1 serviceFacade2 = ServiceFactory.getInstance().getSerficeFacade2(entityManager); AbstractXMLServiceStrategy <XMLObject> concreteStrategy = XMLSaveStrategy.getStrategyMap().get(xmlObject.getClass().getName()); concreteStrategy.setServiceFacade1(serviceFacade1); concreteStrategy.setServiceFacade2(serviceFacade2); concreteStategy.saveXML(xmlObject);
}
|
Среди недостатков сразу вижу: 1). статическая мапа будет долго хранится в памяти (а там нужно хранить все стратегии, их 8 всего, ну может и больше появится) 2). каждый раз при сохранении какого-то типа XML я создаю новые инстансы фасадов, в принципе, наверное тоже не очень економно... но с другой стороны - для тестирования проще: можно легко заменить имплементацию фасада и сетнуть в стратегию...
посоветуйте в чем я ошибся когда создавал такую структуру? Может подскажите какие то альтернативные варианты?
Спасибо |