Je pense que mon autre réponse représente le cas général, mais le PO a commenté en demandant des détails (j'ai donc estimé qu'il méritait une réponse distincte). Malheureusement, je ne connais pas le modèle de référentiel, mais je vais essayer les autres. En règle générale, je pense que la meilleure façon de les expliquer est de savoir quel problème vous voulez résoudre, pourquoi vous voulez le résoudre et comment le problème y parvient.
Singleton
Ce modèle est utilisé lorsque nous voulons garantir qu'il n'y a qu'un seul élément. Le modèle est accompli en empêchant les autres de créer notre objet.
Wikipédia
MVC
Ce modèle est utilisé pour aider à garder les choses modulaires avec tous les avantages qui en découlent. La vue est "l'interface utilisateur", le modèle est les données (y compris la logique métier) et le contrôleur est la façon dont les actions de l'utilisateur manipulent le modèle. Avec cette modularité, rien ne m'empêche d'avoir plusieurs vues / contrôleurs pour travailler avec le même modèle. Pour un exemple trop simplifié, je peux interagir avec mon e-mail ("modèle") via un site Web, une application de bureau et mon iPhone ("vues + contrôleurs"). Si j'ai une boîte aux lettres de groupe partagée, je pourrais créer un contrôleur qui n'enverrait pas de courrier électronique et réutiliser la même vue d'application et le même courrier électronique. (oui trop simpliste, mais j'espère compréhensible :))
De plus, avec cette séparation bien définie des préoccupations, les changements dans l'un (idéalement) ne nécessitent pas de changements dans un autre. Exemple concret, si j'ai besoin de prendre en charge la lecture / écriture dans une base de données MySQL au lieu d'une base de données Oracle, je n'aurais qu'à changer mon modèle et ma vue / contrôleur ne change pas.
Wikipédia
Usine
Il faut être prudent ici car il existe de nombreux modèles similaires appelés Factory ... Je vais parler de l' usine abstraite , mais vous devez savoir qu'il existe également un modèle de méthode Factory .
Fondamentalement, j'utiliserais une usine abstraite lorsque je connais les étapes que je veux effectuer, mais les étapes sur la façon d'accomplir ces étapes individuelles peuvent varier. Par exemple, je pourrais créer une application où je dois créer une boîte de dialogue avec un bouton dessus. En faisant utiliser mon code à une fabrique d'interface utilisateur hypothétique, si j'ai besoin de mon code sur Mac ou Linux au lieu de Windows, je fournis simplement une fabrique différente et le reste de mon code ne change pas. Pour un exemple potentiellement plus sauvage, je pourrais avoir une Web Factory et tout à coup la plupart du code soutenant mon application de bureau alimente maintenant également un site Web riche :) (ok peu pratique pour d'autres raisons, mais en théorie :))