Шаблон "фабричный метод" в Java с помощью дженериков, как к?

Вы можете просто создать модель профиля пользователя с отношением OneToOne и запустить ее, используя сигнал всякий раз, когда пользователь был добавлен, не касаясь модели пользователя.

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User

class Profile(models.Model):
    user=models.OneToOneField(User, on_delete=models.CASCADE)
    q1 = models.TextField()
    q2 = models.TextField()
   
    def __unicode__(self):
        return self.user.q1


def create_profile(sender, **kwargs):
    user = kwargs["instance"]
    if kwargs["created"]:
        user_profile = Profile(user=user)
        user_profile.save()
post_save.connect(create_profile, sender=User)

5
задан Jay 12 May 2009 в 23:08
поделиться

4 ответа

Вы должны определить фабрику следующим образом:

public abstract class DAOFactory<DAO extends BaseDAO> {
public DAO getCustomerDAO();
public static <DAO extends BaseDAO> DAOFactory<DAO> getInstance(Class<DAO> typeToken){
  // instantiate the the proper factory by using the typeToken.
  if(system.getProperty("allowtest").equals("yes")) {
  return new TestDAOFactory();
  }
  else return new ProdDAOFactory();
}

getInstance должен возвращать правильно типизированный DAOFactory.

Заводская переменная будет иметь тип:

DAOFactory<CustomerDAO> factory = DAOFactory<CustomerDAO>.getInstance(CustomerDAO.class);

, и использование будет правильно напечатано:

CustomerDAO dao = factory.getCustomerDAO();
dao.getCustomer();

единственная проблема, вероятно, будет заключаться в приведении типов внутри методов getInstance.

10
ответ дан 18 December 2019 в 07:31
поделиться

Ваш пример не демонстрирует необходимость в BaseDAO , и нет причин, по которым DAOFactory. getCustomerDAO () не следует объявлять для возврата CustomerDAO . Так что я не вижу там необходимости в дженериках. Однако учтите следующее:

interface DataAccess<T> {
  void store(T entity);
  T lookup(Serialiable identifier);
  void delete(Serializable identifier);
  Collection<? extends T> find(Criteria query);
}

abstract class DataAccessFactory {
  abstract DataAccess<T> getDataAccess(Class<T> clz);
  static DataAccessFactory getInstance() {
    ...
  }
}

Я использовал что-то вроде этого подхода в нескольких проектах, и очень приятно написать один DAO, который работает для каждой сущности в модели. Слабость - это методы поиска. Есть несколько изящных подходов, и предстоящая работа в JPA заключается в стандартизации API «критериев», но на данный момент часто проще всего раскрыть критерии базового механизма устойчивости.

и очень приятно написать один DAO, который работает для каждой сущности в модели. Слабость - это методы поиска. Есть несколько изящных подходов, и предстоящая работа в JPA заключается в стандартизации API «критериев», но на данный момент часто проще всего раскрыть критерии базового механизма устойчивости.

и очень приятно написать один DAO, который работает для каждой сущности в модели. Слабость - это методы поиска. Есть несколько изящных подходов, и предстоящая работа в JPA заключается в стандартизации API «критериев», но на данный момент часто проще всего раскрыть критерии базового механизма устойчивости.

5
ответ дан 18 December 2019 в 07:31
поделиться

Существует множество статей, в которых подробно описывается, что вам нужно:

Обратите внимание, что, в отличие от вашего примера, нет причин, по которым методы DAOFactory не должен возвращать фактические подклассы (например, CustomerDAO getCustomerDAO () ). Кроме того, основным преимуществом использования общих DAO является наличие типа сущности «обобщенный», поэтому вам не нужно выполнять приведение из load () / get () / find () и аналогичных методов.

6
ответ дан 18 December 2019 в 07:31
поделиться

Когда я использовал фабрики, я обычно использовал instanceof для определения истинного типа объекта. Например:

CustomerDAO dao;
if (factory.getCustomerDAO() instanceof CustomerDAO) {
   dao = factory.getCustomerDAO();
}
dao.getCustomer();

Мне это кажется более понятным, особенно если factory.getCustomerDAO () не возвращает ничего близкого к CustomerDAO (из-за изменений в реализации).

Только мои два цента.

0
ответ дан 18 December 2019 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: