I feel my other answer stands for the general case, but the OP commented asking for specifics (so I felt it deserved a seperate answer). Sadly I'm not familiar with the Repository pattern, but I'll take a stab at the others. As a rule, I think the best way to explain these is through what problem you want to solve, why you want to solve it and how the problem accomplishes it.
This pattern is used when we want to guarantee that there is only one of something. The pattern is accomplished by preventing others from creating our object.
This pattern is used to help keep things modular with all benefits that come with that. The View is the "user interface", the Model is the data (including business logic), and the Controller is how the user actions manipulate the model. With this modularity, nothing stops me from having multiple views / controllers to work with the same model. For an overly simplified example, I can interact with my email ("model") through a web site, desktop application, and my iPhone ("views + controllers"). If I have a shared group mailbox, I could create a controller that would not send email, and reuse the same application view and email. (yes overly simplistic, but hopefully understandable :) )
Additionally, with this well defined seperation of concerns, changes in one (ideally) do not require changes in another. Concrete example, if i need to support reading/writing to a MySQL database instead of an Oracle database, I would only need to change my model, and my view/controller does not change.
Have to be careful here since there are many similar patterns called Factory... I'll talk about the Abstract Factory, but you should know there is also a Factory Method pattern as well.
Basically, I would use an Abstract Factory when I know what steps I want to perform, but the steps on how to accomplish these inividual steps could vary. For example, I could be building an application where I need to create a dialog box with a button on it. By having my code use a hypothetical UI factory, if I need my code on Mac or Linux instead of Windows, I just provide a different factory, and the rest of my code does not change. For a a potentially wilder example, I could have a Web Factory and suddenly most of the code backing my desktop application is now also powering a rich website :) (ok impractical for other reasons, but in theory :) )