This chapter discusses approaches for designing software systems with reuse. It covers component-based development, where software is built from reusable components. Application families are introduced as a way to achieve reuse by developing a common core that is customized for different applications. Design patterns are discussed as reusable abstractions that promote reuse through solutions to common design problems. The chapter also addresses the benefits of reuse, different types of reusable artifacts, processes for component and framework reuse, and challenges involved in software reuse.