Я использую фабрику, когда хочу, чтобы фабрика создала один из нескольких возможных подклассов (и я хочу, чтобы вызывающая сторона знала о базовом классе, но не знала о подклассах).
Кроме того, иногда я буду использовать статические методы класса вместо перегруженного конструктора, когда разные статические методы принимают одинаковые типы параметров (и, следовательно, конструкторы не могут быть перегружены на основании только одного типа параметра). Вот надуманный пример:
Department
{
//static factory methods
public static Department createFromBoss(string bossName) { ... }
public static Department createFromLocation(string locationName) { ... }
}