Abstract Factory
When a system should be independent of how its products are created, composed, and represented.
When a system should be configured with one of multiple families of products.
When a family of related product objects is designed to be used together, and there is a need to enforce this constraint.
When a class library of products should be provided, and just their interfaces should be revealed, not their implementations.