Provides an interface for creating families of  related or dependent objects without specifying their concrete classes