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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Spring & Abstract Factory 
:(
    Опции темы
garbuz
Дата 28.7.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 11



Итак, есть некая структура классов, целиком и полностью подпадающая под паттерн Abstract Factory, если кто немного подзабыл или просто не знает, то тут можно ознакомиться http://ru.sun.com/pdf/patterns/pattern4.pdf

Во первых есть три интерфейса
Код

public interface StudentDAO {
    void add(Student student) throws SQLException;

    void update(Student student) throws SQLException;

    void delete(Student student) throws SQLException;

    Student getById(Long studentId) throws SQLException;

    Collection getAll() throws SQLException;

    Collection getStudentsFromGroup(Group group, int year) throws SQLException;
}   // + еще два подобных интерфейса для групп (GroupDAO) и предметов (SubjectDAO) .  


Вот сама фабрика
Код

abstract public class DAOFactory {
    public static final int JDBC = 0;
    public static final int HIBERNATE = 1;

    public abstract StudentDAO getStudentDAO();     

    public abstract GroupDAO getGroupDAO();

    public abstract SubjectDAO getSubjectDAO();


    public static DAOFactory getDAOFactory(int whichFactory) {
        switch (whichFactory) {
            case JDBC:
                return new HibernateDAOFactory();
            case HIBERNATE:
                return new JdbcDAOFactory();
            default:
                return null;
        }
    }
}



Классы, расширяющие фабрику
Код

public class HibernateDAOFactory extends DAOFactory {

    public StudentDAO getStudentDAO() {
        return new StudentDAOHibernateImpl();
    }

    public GroupDAO getGroupDAO() {
        return new GroupDAOHibernateImpl();
    }

    public SubjectDAO getSubjectDAO() {
        return new SubjectDAOHibernateImpl();
    }

}

Код

public class JdbcDAOFactory extends DAOFactory {
    
    public StudentDAO getStudentDAO() {
        return new StudentDAOJdbcImpl();
    }

    public GroupDAO getGroupDAO() {
        return new GroupDAOJdbcImpl();
    }

    public SubjectDAO getSubjectDAO() {
        return new SubjectDAOJdbcImpl();
    }
}


И собственно 6 классов, имплементирующие эти три интерфейса.

Код

StudentDAOHibernateImpl.java
GroupDAOHibernateImpl.java
SubjectDAOHibernateImpl

StudentDAOJdbcImpl
GroupDAOJdbcImpl
SubjectDAOJdbcImpl



Так вот, вопрос. Как лучше все это дело инициализировать в спринге? Имеется ввиду в xml-файле, где мы бины объявляем.
Насчет последних 6 классов все понятно, а вот как быть с остальными, как их между собой связать? Что-то у меня не получается.
Хотелось бы вот так получать бин
Код

DAOFactory factory = (DAOFactory) ctx.getBean("DAOFactory");

И от него уже плясать. 
Да, и еще хотел спросит, как правильно выбирать нужную нам фабрику, расширяющую абстрактную, мне кажется что через switch как-то некрасиво. Или может вообще лучше прописать подобное в конструкторе главной фабрики?
Код

<constructor-arg><value>1</value></constructor-arg>

А в случае необходимости менять этот параметр...
PM MAIL   Вверх
Dwyane
Дата 28.7.2008, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Рекомендую делать не так. Сделай базовый интерфейс. public interface IDOA<Template> {void add(T object);...}. Все остальные интерфейсы будут extends от этого с указанием реального класа доменного объекта.
PM MAIL   Вверх
garbuz
Дата 28.7.2008, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 11



Цитата(Dwyane @  28.7.2008,  23:12 Найти цитируемый пост)
Рекомендую делать не так. Сделай базовый интерфейс. public interface IDOA<Template> {void add(T object);...}. Все остальные интерфейсы будут extends от этого с указанием реального класа доменного объекта. 

Спасибо, думал об этом, потому что действительно все три интерфейса почти дублируют друг друга. Но главный вопрос темы не в этом smile

PM MAIL   Вверх
Dwyane
Дата 28.7.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



<bean id="userDao" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="proxyInterfaces">
            <value>com.package.IUserDAO</value>
        </property>
        <property name="target">
            <bean parent="abstDaoImpl">
                <constructor-arg>
                    <value>com.package.User</value>
                </constructor-arg>
            </bean>
        </property>
    </bean>

PM MAIL   Вверх
garbuz
Дата 28.7.2008, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 11



Dwyane, уже больше похоже на правду, но все равно я не совсем все понял.

Вот как описываются мои 6 классов-реализаций
Код

    <bean name="hibernateStudentDAO" class="daoImpl.Hibernate.StudentDAOHibernateImpl"/>
    <bean name="hibernateGroupDAO"  class="daoImpl.Hibernate.GroupDAOHibernateImpl"/>
    <bean name="hibernateSubjectDAO" class="daoImpl.Hibernate.SubjectDAOHibernateImpl"/>

    <bean name="jdbcStudentDAO" class="daoImpl.Jdbc.StudentDAOJdbcImpl"/>
    <bean name="jdbcGroupDAO" class="daoImpl.Jdbc.GroupDAOJdbcImpl"/>
    <bean name="jdbcSubjectDAO" class="daoImpl.Jdbc.SubjectDAOJdbcImpl"/>


Как описать главную фабрику и наследуемые от нее? Причем у них все полей как таковых нет... или же их добавить надо...
PM MAIL   Вверх
Dwyane
Дата 29.7.2008, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



<bean id="userDao" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="proxyInterfaces">
            <value>com.package.IUserDAO</value>
        </property>
        <property name="target">
            <bean parent="abstDaoImpl">
                <constructor-arg>
                    <value>com.package.User</value>
                </constructor-arg>
            </bean>
        </property>
    </bean>


    <bean id="abstDaoImpl" abstract="true"
            class="com.package.AbstrDaoImpl">
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="mappingResources">
            <list>
                <value>./hibernate/user.hbm.xml</value>
    </list>
        </property>
</bean>
У вас вообще хибернейт уже синтегрирован с порталом и вы хотите узнать как можно лучше организовать систему? Или хибернейт не интегрирован? В этом случае прийдется еще попотеть.
PM MAIL   Вверх
garbuz
Дата 29.7.2008, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 11



немного переписал классы, которые наследуются от абстрактного
Код

public class HibernateDAOFactory extends DAOFactory {
    private StudentDAO studentDAO;
    private GroupDAO groupDAO;
    private SubjectDAO subjectDAO;
   

    public void setStudentDAO(StudentDAO studentDAO) {
        this.studentDAO = studentDAO;
    }

    public void setGroupDAO(GroupDAO groupDAO) {
        this.groupDAO = groupDAO;
    }

    public void setSubjectDAO(SubjectDAO subjectDAO) {
        this.subjectDAO = subjectDAO;
    }

    public StudentDAO getStudentDAO() {
        return studentDAO;
    }

    public GroupDAO getGroupDAO() {
        return groupDAO;
    }

    public SubjectDAO getSubjectDAO() {
        return subjectDAO;
    }
    // соответственно такой же и JdbcDAOFactory
}

Вот что с xml
Код

<bean name="DAOFactory" class="students.dao.factory.DAOFactory" abstract="true">
     </bean>

    <bean name="hibernateDAOFactory" parent="DAOFactory" class="factory.HibernateDAOFactory">
        <property name="studentDAO" ref="hibernateStudentDAO"/>
        <property name="groupDAO" ref="hibernateGroupDAO"/>
        <property name="subjectDAO" ref="hibernateSubjectDAO"/>
    </bean>

    <bean name="jdbcDAOFactory" parent="DAOFactory" class="factory.JdbcDAOFactory">
        <property name="studentDAO" ref="jdbcStudentDAO"/>
        <property name="groupDAO" ref="jdbcGroupDAO"/>
        <property name="subjectDAO" ref="jdbcSubjectDAO"/>
    </bean>


    <bean name="hibernateStudentDAO" class="daoImpl.Hibernate.StudentDAOHibernateImpl"/>
    <bean name="hibernateGroupDAO" class="daoImpl.Hibernate.GroupDAOHibernateImpl"/>
    <bean name="hibernateSubjectDAO" class="daoImpl.Hibernate.SubjectDAOHibernateImpl"/>

    <bean name="jdbcStudentDAO" class="daoImpl.Jdbc.StudentDAOJdbcImpl"/>
    <bean name="jdbcGroupDAO" class="daoImpl.Jdbc.GroupDAOJdbcImpl"/>
    <bean name="jdbcSubjectDAO" class="daoImpl.Jdbc.SubjectDAOJdbcImpl"/>

Вроде все работает, но что-то мне не нравится все равно.
До сих пор не понятно, как лучше выбирать нужную фабрику, расширяющую абстрактную. С параметром что-то не получилось.
Может не мудрить и делать сразу так?
Код

DAOFactory factory = (DAOFactory) ctx.getBean("hibernateDAOFactory");
либо
DAOFactory factory = (DAOFactory) ctx.getBean("jdbcDAOFactory");

Вот это обязательно должно быть? У меня вроде без этого работает. Ну то есть указываю эту информацию в другом месте, в hibernate-cfg.xml
Код

      <list>
                <value>./hibernate/user.hbm.xml</value>
     </list>


PM MAIL   Вверх
Dwyane
Дата 30.7.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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


 




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


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

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