On Defining Design Patterns to Generalize and Leverage Automated Constraint Solving