Les constructeurs non publics sont utiles lorsqu'il existe des exigences de construction qui ne peuvent être garanties uniquement par le constructeur. Par exemple, si une méthode d'initialisation doit être appelée juste après le constructeur, ou si l'objet doit s'enregistrer auprès d'un objet conteneur/gestionnaire, cela doit être fait en dehors du constructeur. En limitant l'accès au constructeur et en ne fournissant qu'une méthode de fabrique, vous pouvez vous assurer que toute instance reçue par un utilisateur remplira toutes ses garanties. Cette méthode est aussi couramment utilisée pour mettre en œuvre un Singleton, qui n'est en fait qu'une autre garantie de la classe (qu'il n'y aura qu'une seule instance).
La raison de rendre le constructeur protégé, plutôt que privé, est la même que pour rendre toute autre méthode ou champ protégé plutôt que privé : afin qu'il puisse être hérité par les enfants. Peut-être voulez-vous une méthode de fabrique publique et non virtuelle dans la classe de base, qui renvoie des références aux instances des classes dérivées ; les classes dérivées veulent évidemment avoir accès aux constructeurs parents, mais vous ne voulez toujours pas les créer en dehors de votre fabrique.