provide interface for creating family of related or dependent objects without specifying their concrete classes