Когда применяется?
Определяет интерфейс для создания объектов класса, но при этом в подклассах решается непосредственно к какому классу будет относиться данный.
Применяется паттерн когда заранее неизвестно к какому типу объект будет относиться, когда базовый класс должен руководить процессом создания объектов классов-наследников и когда система должна быть гибко-расширяемой и в неё можно будет легко вводить новые классы.