iOS Design Patterns & Flavors with Unit Tests by Example

There’re many articles about design patterns that provide a good amount of information on either a comparison between different design patterns or on how to get started, and some are really good and can help you get a grasp of the theory and get you started. But some of them fall short in providing examples (real-life examples) for you to play around with them. If you are like me (a very visual and by example kind of learner) these articles may not be enough for you to feel confident to use on your projects.

Another is that there are many different flavors of each design pattern and this makes it even harder for you to select the best design pattern for your project. These articles may help you up get started but then you might find your self searching for other examples that not necessary follow the same flavor that you already started your project with.

With this article, I want to provide a centralized source of examples of different design patterns and flavors. Initially I added three different design patterns and on the follow-up post I’ll add two flavors (one for MVVM and one for VIPER.


I wrote the same app using three different design patterns (MVVM, MVC and VIPER).

The app uses URLSession to get jobs using GitHub Jobs API and either uses the user location or a location input by the user. The request uses the location and the input text to get available jobs for that location.

App Breakdown


  • API Client
  • Location Services
  • Image Handler (Image loader and caching)


  • Job Search/List
  • Job Detail
  • Job Description Detail


The different design patterns approach is separated into different branches:


Model-View-ViewModel Dependency Injection

Model-View-ViewModel Environment Singleton


All approaches use an environment singleton. Only theMVVM has an alternate approach that uses dependency injection (DI) with protocols. They all have unit tests, except forMVC.

What’s Next?

As mentioned above, the next article will have two new flavors (Semi-Reactive MVVM and VIPER Interactor-Router).

Follow me

Twitter: dmlebron

iOS Engineer