This document provides an introduction to design patterns. It defines what a design pattern is, discusses common types and classifications of patterns. It explains the benefits of using patterns such as reducing time to design applications and avoiding problems from inexperienced design decisions. Examples of specific patterns are described in detail including Elements of Identification, Catalytic Scenarios, and Mutable Code. Principles of object-oriented design like programming to an interface are covered. The differences between class and interface inheritance and composition vs inheritance are explained.