Design patterns implemented in Scala Inspired by Design patterns implemented in Java Introduction Design patterns are formalized best practices that the programmer can use to solve common problems when designing an application or system. The classical design patterns are the 23 design patterns by GoF. This project implements dozens of design patterns in Scala. The Scala language has several advanced features which make the implementations are different from other programming languages. Design patterns are categorized into: Creational Structural Behavioral Other Persistence For each design pattern, it tags: scala features indicates if the implementation uses scala language-specific features. functional indicates if the design pattern can be implemented in functional-programming style. Gang of four indicates if the design pattern is one of the classical 23 design patterns by GoF Creational Name scala features functional Gang of four abstract factory no no yes builder no no yes cake yes (trait mix-in) no no factory kit no yes no factory method no no yes prototype no no yes simple factory yes (companion object) no no singleton yes (object) no yes value object yes (case class) no no Structural Name scala features functional Gang of four adapter yes (implicit class) no yes bridge no no yes composite no no yes decorator yes (stackable trait) no yes facade no no yes flyweight no no yes magnet yes (implicit conversion) no no proxy no no yes type classes yes (impilict parameter) no no Behavioral Name scala features functional Gang of four chain of responsibility yes (partial function) yes yes command no yes yes loan yes (structural type) yes no mediator no no yes memento no no yes observer no no yes state no no yes strategy no yes yes template method no no yes visitor no yes yes Other Name scala features functional Gang of four selfless trait yes (companion trait) no no monad no yes no Persistence Name scala features functional Gang of four data access object no no no repository no no no Getting Started Run sbt assembly to compile, run tests and package all sub-projects. If you want to operate specific sub-project, use project command in sbt shell to switch sub-project: > projects // list all sub-projects > project builder // switch to ' builder ' sub-project > project all // switch to ' all ' project which including all sub-projects License This project is licensed under the terms of the Apache 2.0 license.