Die Fabrikmuster Mode stammt von einem fast dogmatischen Glauben unter den Programmierer in „C-Stil“ Sprachen (C / C ++, C #, Java), dass die Verwendung der „neuen“ Schlüsselwort ist schlecht, und sollte unter allen Umständen vermieden werden (oder zumin dest zentralisiert). Dies wiederum kommt aus einer ultra-strengen Auslegung der einheitlichen Prinzip Verantwortung (die „S“ von SOLID) und auch der Dependency Inversion Principle ( „D“). Einfach gesagt, sagt der SRP, dass im Idealfall ein Codeobjekt einen „Grund zu ändern“ haben sollte, und man nur; dass „Grund zu ändern“ ist der zentrale Zweck dieses Objekts, seine „Verantwortung“ in der Codebasis, und alles andere, was eine Änderung Code erfordert nicht Öffnung benötigen bis diese Klassendatei. Das DIP ist noch einfacher; ein Codeobjekt soll nie auf ein anderes konkretes Objekt abhängig sein,
Typischer Fall, durch „neue“ und einen öffentlichen Konstruktor verwenden, Sie koppeln den anrufenden Code auf eine bestimmte Bauweise einer bestimmten konkreten Klasse. Ihr Code muss jetzt wissen, dass eine Klasse MyFooObject existiert und hat einen Konstruktor, der einen String und einen int nimmt. Wenn das Konstruktor immer mehr Informationen benötigt, müssen alle Verwendungen des Konstrukteurs aktualisiert werden in diesen Informationen weitergeben, einschließlich der man jetzt Sie schreiben, und deshalb sind sie verpflichtet, etwas Gültigkeit zu haben, in übergeben, und so müssen sie entweder es oder geändert werden, um es (mehr Verantwortung an die raubend Objekte hinzufügen). Darüber hinaus müssen, wenn MyFooObject jemals in der Codebasis von BetterFooObject ersetzt wird, werden alle Verwendungen der alten Klasse ändern das neue Objekt anstelle der alten zu errichten.
Stattdessen sollten alle Benutzer von MyFooObject direkt von "IFooObject" abhängig sein, das das Verhalten der Implementierung von Klassen einschließlich MyFooObject definiert. Jetzt können Benutzer von IFooObjects nicht nur ein IFooObject erstellen (ohne zu wissen, dass eine bestimmte konkrete Klasse ein IFooObject ist, das sie nicht benötigen), sondern müssen stattdessen eine Instanz einer IFooObject-implementierenden Klasse oder Methode erhalten von außen durch ein anderes Objekt, das dafür verantwortlich ist, das richtige IFooObject für den Umstand zu erstellen, der in unserer Sprache normalerweise als Factory bezeichnet wird.
Hier trifft Theorie auf Realität. Ein Objekt kann niemals für alle Arten von Änderungen geschlossen werden. Beispiel: IFooObject ist jetzt ein zusätzliches Codeobjekt in der Codebasis, das geändert werden muss, wenn sich die von Verbrauchern oder Implementierungen von IFooObjects benötigte Schnittstelle ändert. Dies führt zu einer neuen Komplexität, die die Art und Weise beeinflusst, wie Objekte in dieser Abstraktion miteinander interagieren. Darüber hinaus müssen die Verbraucher noch tiefgreifender Änderungen vornehmen, wenn die Schnittstelle selbst durch eine neue ersetzt wird.
Ein guter Programmierer weiß, wie er YAGNI ("Du wirst es nicht brauchen") mit SOLID in Einklang bringt, indem er das Design analysiert und Orte findet, bei denen es sehr wahrscheinlich ist, dass sie sich auf eine bestimmte Weise ändern, und sie überarbeitet, um toleranter zu sein diese Art von Veränderung, denn in diesem Fall "wirst du es brauchen".