Você usa a nomenclatura DAO, quando está criando um objeto DAO.
DAO e Repository são padrões diferentes. O DAO é um padrão que abstrai o mecanismo de persistência e provê acesso aos dados, estejam eles num banco de dados, arquivo txt ou numa rede, por exemplo.
O Repository é um conceito de domínio. É uma coleção dos seus objetos, só que mais evoluída, com consultas mais específicas relativas ao domínio da aplicação. É um conceito de domínio, não de infra. O Repository não conhece banco de dados e coisas do gênero.
A implementação do Repository pode ser um DAO - não é uma necessidade, é uma possibilidade.
Por isso eu disse. Se você está usando um repositório, não é obrigatório colocar Repository no nome.
Não entendi como chamar de XYZDAO ajuda a identificar que é um repositorio.
Chame de repositorio e pronto.
A diferença principal é que o DAO é um serviço do andar (camada) de integração (alguns chamam de camada de persistencia) e o repositorio é um objeto (não é um serviço) do andar de dominio.
Repositorios não têm interfaces de definição porque só é possivel uma implementação. No máximo vc tem uma herança basead em classes abstratas. Por exemplo AbstratRepository e ClienteRepository. No repositorio vc injeta o DomainStore. No DAO vc injeta o DataSource ou algum tipo de provedor de conexões.
O DAO provê dados, o Repositorio provê entidades. O Repositório de especializa em executar queries ( o spring tem até um padrão para ajudar nisto, mas o que o Spring de @Repository é na realidade um DAO e não um repositorio verdadeiro, pois está na cada de integração).
O Repositorio usa um mecanismo que o DomainStore entende para defenir as queries, mas elas não especificam como fisicamente a querie é feita. Isto significa que um bom domainstore tanto procura em SQL como em NoSQL sem diferença. Para isto são usados os padrões QueryObject e Interpreter. Tem um artigo no javabuilding especialmente sobre isto
Se vc quiser isolar a tecnologia de persistencia o fluxo seria ssim
Repositorio – cria querie object POJO --> envia para DomainStore — interpreta para querie objet nativo , por exemplo criteria api do hibernate --> exeecuta no domain store real —> devolve o resultado.
Se não quiser isolar, pode fazer o repositorio simplesmente utiliza a api de criterio e chamar diretamente a api nativa do domainstore
A interface não serve para definir polimorfismo – isso é uma consequencia – serve para definir um contrato independente da implementação.
Para serviços , especialmente se publicos às outras camadas é bom ter um contrato separado. Para objetos internos ao dominio podem ser implementados sem o padrão service. O padrão service, e especialmente o service façade têm que ter interfaces. Tento explicar isso em um artigo do meu blog
A questão aqui não é DAO VS Repositorio, mas sim usar a correta numenclatura. Não vale chamar de ControladorDeCliente e dizer que um DAO, então também não vale usar ClienteDAO e dizer que é um repositorio. Não apenas pelos que os padrões representam em si mesmos, mas sobre os andares onde pertencem. O uso de nomes padrão e camadas padrão ajuda a auto-documentar o código e ajuda também a organizar as responsabilidades de cada objeto em cada andar.