Software design and design patterns are both broad topics where a lot has been written; this is necessarily a sampling.
[Disclosure: Note that I may have been involved in some of the materials mentioned below, and I work for Industrial Logic.]
- Industrial Logic’s Design Patterns Vol. 1 – Foundational Patterns for Software Programmers [multiple languages]
- Industrial Logic’s Design Patterns Vol. 2 – Producing Simpler Designs with Object Composition [multiple languages]
- Industrial Logic’s Design Patterns Vol. 3 – Navigating Objects & Changing Behavior Dynamically [multiple languages]
- Buschmann, Frank, et al. Pattern-Oriented Software Architecture. Wiley, 1996. [series]
- Evans, Eric. Domain-Driven Design. Addison-Wesley, 2003. [Java, but generally language-independent]
- Freeman, Eric, et al. Head-First Design Patterns. O’Reilly, 2004.
- Gamma, Erich, et al. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1994. [Multiple languages, but generally language-independent]
- Martin, Robert C. Agile Software Development, Principles, Patterns, and Practices. Pearson, 2002. [Java]
- Yourdon, Edward, and Larry Constantine. Structured Design. Prentice-Hall, 1979.
- Martin, Bob. “Design Principles and Design Patterns” [early articulation of “SOLID” principles]
- Coad, Peter. “Archetypes, Color, and the Domain-Neutral Component”
[I welcome further suggestions of resources you’ve found useful, provided they’re something I (or a friend) can review before adding them here.]