Software Factories: Assembling Applications with Patterns, Models, Frameworks, and Tools