Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Правильно использовать фабрику и стратегию


Автор: Andy_L20066 19.4.2012, 10:24
Привет, вообщем немного заплутался из правильным дизайном. Опишу идею в двух словах: есть 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 я создаю новые инстансы фасадов, в принципе, наверное тоже не очень економно... но с другой стороны - для тестирования проще: можно легко заменить имплементацию фасада и сетнуть в стратегию...

посоветуйте в чем я ошибся когда создавал такую структуру? Может подскажите какие то альтернативные варианты?

Спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)