Estou desenvolvendo uma API RESTful e acho conveniente usar DAOs para meus recursos porque, embora planeje apenas usar a memória para armazená-los, não quero fechar uma porta para quem estiver usando minha biblioteca, se eles decidirem usar uma implementação de banco de dados para o DAO.
Minha pergunta é se o DAO deve ser um singleton ou não. Caso contrário, o serviço terá uma instância do DAO e seria mais ou menos assim:
@Path("eventscheduler")
public class EventSchedulerService {
private IEventSchedulerDao dao = new EventSchedulerDao();
// in case a different implementation is to be used
public void setEventSchedulerDao(IEventSchedulerDao dao) {
this.dao = dao;
}
@Path("{uniqueName}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Tournament getTournament(@PathParam("name") String uniqueName) {
return dao.get(uniqueName);
}
@Path("create")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Tournament createTournament(Tournament tournament) {
return dao.create(tournament);
}
}
Embora o DAO fosse um singleton, mas acho que não haveria muita diferença, apenas na primeira linha:
private IEventSchedulerDao dao = EventSchedulerDao.getInstance();
Eu ainda teria que usar uma IEventSchedulerDao
instância, mas acho que todos os singletons funcionam assim, certo? Por alguma razão, eu sempre correlaciono singletons a métodos estáticos; portanto, em vez de ter uma instância singleton visível para o usuário getInstance()
, isso estaria oculto e ele / ela usaria EventSchedulerDao.get(name)
, etc ... de maneira estática. Isso é uma coisa ou sou apenas eu?
Então, devo ou não ter DAOs singleton?
E, como uma questão paralela, está bem minha abordagem ter portas abertas para o usuário implementar seus próprios DAOs?