Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильно использовать фабрику и стратегию, Применение фабрики и стратегии  
V
    Опции темы
Andy_L20066
Дата 19.4.2012, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 10.3.2008

Репутация: нет
Всего: 1



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

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

Спасибо
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0868 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.