Design pattern designed to provide a flexible solution to various object creation problems in object-oriented programming