Ich bin der Meinung, dass meine andere Antwort für den allgemeinen Fall steht, aber das OP hat kommentiert und nach Einzelheiten gefragt (daher hatte ich das Gefühl, dass es eine separate Antwort verdient). Leider bin ich mit dem Repository-Muster nicht vertraut, aber ich werde die anderen stechen. In der Regel denke ich, dass der beste Weg, dies zu erklären, darin besteht, welches Problem Sie lösen möchten, warum Sie es lösen möchten und wie das Problem es erreicht.
Singleton
Dieses Muster wird verwendet, wenn wir garantieren möchten, dass es nur eines von etwas gibt. Das Muster wird erreicht, indem verhindert wird, dass andere unser Objekt erstellen.
Wikipedia
MVC
Dieses Muster wird verwendet, um die Dinge modular zu halten und alle damit verbundenen Vorteile zu nutzen. Die Ansicht ist die "Benutzeroberfläche", das Modell sind die Daten (einschließlich der Geschäftslogik) und der Controller gibt an, wie die Benutzeraktionen das Modell manipulieren. Mit dieser Modularität hindert mich nichts daran, mehrere Ansichten / Controller zu haben, um mit demselben Modell zu arbeiten. Für ein stark vereinfachtes Beispiel kann ich mit meiner E-Mail ("Modell") über eine Website, eine Desktop-Anwendung und mein iPhone ("Ansichten + Controller") interagieren. Wenn ich ein freigegebenes Gruppenpostfach habe, kann ich einen Controller erstellen, der keine E-Mails sendet, und dieselbe Anwendungsansicht und E-Mail wiederverwenden. (ja zu simpel, aber hoffentlich verständlich :))
Darüber hinaus erfordern Änderungen in einem (idealerweise) bei dieser genau definierten Trennung von Bedenken keine Änderungen in einem anderen. Konkretes Beispiel: Wenn ich das Lesen / Schreiben in eine MySQL-Datenbank anstelle einer Oracle-Datenbank unterstützen möchte, muss ich nur mein Modell ändern, und meine Ansicht / mein Controller ändert sich nicht.
Wikipedia
Fabrik
Seien Sie hier vorsichtig, da es viele ähnliche Muster gibt, die Factory genannt werden ... Ich werde über die abstrakte Factory sprechen , aber Sie sollten wissen, dass es auch ein Factory-Methodenmuster gibt .
Grundsätzlich würde ich eine abstrakte Fabrik verwenden, wenn ich weiß, welche Schritte ich ausführen möchte, aber die Schritte zum Ausführen dieser einzelnen Schritte können variieren. Zum Beispiel könnte ich eine Anwendung erstellen, in der ich ein Dialogfeld mit einer Schaltfläche erstellen muss. Wenn mein Code eine hypothetische UI-Factory verwendet und ich meinen Code unter Mac oder Linux anstelle von Windows benötige, stelle ich nur eine andere Factory bereit, und der Rest meines Codes ändert sich nicht. Für ein möglicherweise wilderes Beispiel könnte ich eine Web Factory haben und plötzlich versorgt der größte Teil des Codes, der meine Desktop-Anwendung unterstützt, jetzt auch eine umfangreiche Website :) (ok aus anderen Gründen unpraktisch, aber theoretisch :))