Kann mir jemand sagen, warum bricht Singleton offen/geschlossen Prinzip? Liegt das daran, dass es Probleme beim Erben von dieser Klasse geben könnte?Warum Singleton bricht offen/geschlossen Prinzip?
1
A
Antwort
3
Damit eine Klasse "offen" ist, muss es möglich sein, davon zu erben. Vererbung ist eine "ist-a" -Beziehung. Wenn Sie von einer Singleton-Klasse erben, dann sind Instanzen der Kindklasse aufgrund der "Ist-Ein" -Beziehung auch Instanzen der Elternklasse, was bedeutet, dass Sie plötzlich mehrere Instanzen der Singleton-Klasse haben können.
Wenn die Singleton-Klasse die Vererbung verhindert, ist sie nicht mehr "offen".
Wenn eine Singleton-Klasse die Vererbung zulässt und für die Erweiterung "offen" ist, kann sie das Singleton-Muster nicht mehr erzwingen.
1
Es gibt zwei Probleme mit dem Muster Singleton:
- Es bricht die Offen/Geschlossen-Prinzip, weil die Singleton-Klasse selbst in Kontrolle über die Erstellung der Instanz ist, während andere haben eine harte Abhängigkeit von ihm . Dies verhindert, dass die Implementierung durch eine andere geändert wird, ohne dass umfassende Änderungen in der gesamten Anwendung vorgenommen werden müssen.
- Es bricht das Prinzip der Abhängigkeitsinversion, weil die Konsumenten immer direkt von der konkreten Klasse abhängen, um die Instanz zu erhalten, während die DIP sagt, dass wir auf Abstraktionen angewiesen sind. Dies führt dazu, dass die Singletonimplementierung mitgeschleppt wird und keine übergreifenden Bedenken hinzugefügt werden können, indem die Implementierung in einen Dekorator eingeschlossen wird oder der Client ohne diese Singletonimplementierung verteilt wird.
Könnte kein Singleton eine Schnittstelle implementieren, um beide Probleme zu lösen? Die Schnittstelle bleibt für die Erweiterung offen, während Clients, die von der Schnittstelle abhängig sind, nicht wissen müssen, dass sie alle mit einer Singleton-Instanz hinter der Abstraktion arbeiten. – jaco0646
Wenn die Schnittstelle und die 'Instance' ersetzbar wären, wäre dies nicht das Singleton-Muster, und die' Instance'-Eigenschaft wäre immer noch in der statischen Klasse definiert, wodurch der DIP verletzt wird. – Steven