Attempts to solve questions like, “how do we get incompatible interfaces to work together?”A class, module, or other language construct for specifying how to configure and build an object.An interface or class used to hide a system’s underlying complexity.A function or class, whose primary responsibility is creating instances of another class.A class, module, or function that is used to handle creating or returning objects.Attempts to remove a hard coupling between software components.A design pattern regarding application states and transitions.Instead of implementing a single algorithm directly, a strategy design pattern allows for multiple algorithms.