Используйте фабричный метод при создании экземпляра подкласса, а клиентский код не должен отвечать за решение о том, какой конкретный подкласс создан.
Это полезно, потому что это предотвращает необходимость изменения клиентского кода, когда вам нужно изменить, какой класс создается. Изменение существующего кода является плохой практикой, поскольку обычно оно подвержено ошибкам.
Примером может быть наличие подклассов, где каждый сортирует данные в порядке возрастания, но по-своему. Каждый способ оптимален для определенного вида данных. Например: частично отсортированные данные, данные, которые являются числами и т. д. Код клиента - это класс, который обрабатывает только печать данных. Наличие кода, который решает, какой класс сортировки будет создан в клиентском классе, сделает его сложным классом. Другими словами, имея более чем одну ответственность, в этом случае решаем, какой класс сортировки является оптимальным, и печатаем данные. Помещая код, который решает, какой класс сортировки создается, в класс Factory, он разделяет проблемы, так что вам не нужно менять клиентский класс каждый раз, когда вам нужно изменить, какой подкласс сортировки создается.
Это способ прикрыть свою задницу, если вы можете предвидеть свои изменения, вносящие себя самостоятельно, в то, как или как создается экземпляр класса, тогда фабричные классы имеет смысл использовать. Это помогает сосредоточить внимание ваших классов на одной ответственности и, как следствие, снижает вероятность изменения существующего кода, который не связан с вами.