When the class to create depends on input or config, new EmailNotification() scattered across the code makes every new type a hunt-and-edit job. A factory hides which concrete class is created and hands back an object behind an interface. Reach for it when you pick between, say, SMS, email and push notifications at runtime. If you are assembling one complex object step by step rather than choosing a class, you want a Builder instead.