What are the primary differences between private constructors and public ones, and in what scenarios are they essential?