Details und andere Muster werden in ** Grundlegendes zu Entwurfsmustern durch Vergleichen von Implementierungen in JavaScript und Java ** geschrieben.
Software erstellt oder erlaubt normalerweise mehrere Instanzen aus einer Klasse Es gibt jedoch Zeiten, in denen "ich nur eine Instanz dieser Klasse erstelle und dies nicht möchte". Wie das legendäre Schwert im Rollenspiel Wenn Sie in einem Spiel, Online-Spiel usw. viele legendäre Schwerter erhalten, verringert sich der Wert.
Ein Putter, der garantiert, dass nur eine solche Instanz existiert, wird als ** Singleton-Muster ** bezeichnet.
Der Grund, warum der Konstruktor privat ist, besteht darin, beim Schreiben von `new Singleton ()`
einen Fehler auszulösen
Main.java
public class Main {
public static void main(String[] args) {
System.out.println("Strat.");
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
if (obj1 == obj2) {
System.out.println("obj1 und ojb2 sind dieselbe Instanz.");
} else {
System.out.println("obj1 und obj2 sind nicht dieselbe Instanz.");
}
System.out.println("End.");
//Ich erhalte eine Fehlermeldung, wenn ich Folgendes auskommentiere
// Singleton obj3 = new Singleton();
}
}
Singleton.java
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {
System.out.println("Instanz erstellt.");
}
public static Singleton getInstance() {
return singleton;
}
}
Ich denke, das Ausführungsergebnis wird wie folgt sein
Start.
Instanz erstellt.
obj1 und obj2 sind dieselbe Instanz.
End.
Wie Sie oben sehen können, können Sie sehen, dass die Instanz beim ersten Aufruf der getInstance-Methode erstellt wurde. Die Singleton-Klasse wird geladen, wenn die statische Methode getInstance aufgerufen wird.
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Singleton</title>
<script src="Main.js"></script>
<script src="Singleton.js"></script>
</head>
<body>
</body>
</html>
Main.js
var MAIN = {};
MAIN.init = function() {
console.log("Start.");
/**
*In dem Buch wurde Folgendes angegeben, aber ich habe es geändert, um den Vergleich zu erleichtern.
* var obj1 = SINGLETON.singleton
* var obj2 = SINGLETON.singleton
*/
var obj1 = SINGLETON.singleton.getInstance();
var obj2 = SINGLETON.singleton.getInstance();
if (obj1 === obj2) {
console.log("obj1 und obj2 sind dieselbe Instanz.");
} else {
console.log("obj1 und obj2 sind nicht dieselbe Instanz.");
}
console.log("End.");
};
window.addEventListener("load", MAIN.init);
Singleton.js
var SINGLETON = {};
SINGLETON.singleton = (function() {
var instance;
function init() {
console.log("Instanz erstellt.");
var privateVariable = "I am also private";
function privateMethod() {
console.log("I am private");
}
return {
publicProperty: "I am also public",
publicMethod: function() {
console.log("The public can ses me!");
}
};
};
return {
getInstance: function() {
if (!instance) {
instance = init();
}
return instance;
}
};
})();
Verfügt über eine statische Methode, um nur eine Instanz abzurufen Diese Methode gibt immer dieselbe Instanz zurück
Garantie, wenn Sie nur eine Instanz wie oben beschrieben erstellen möchten Darüber hinaus ist eine verzögerte Ausführung in Singleton wichtig Verbraucht keinen Speicher, es sei denn, eine statische Instanz wird als Grund benötigt Im Fall von C ++ ist die Reihenfolge der dynamischen Initialisierung nicht vorhersehbar, sodass die Verwendung von Singleton den Vorteil hat, dass der Programmierer das Timing selbst bestimmen kann. Verwenden Sie es nicht nur für einen, sondern auch für Dinge, die keinen Sinn ergeben, selbst wenn Sie zwei oder mehr erstellen können
Anwendungsbeispiel Wenn Sie eine Klasse wie eine globale Variable verwenden möchten
[Einführung in Entwurfsmuster, die in der erweiterten und überarbeiteten Java-Sprache gelernt wurden](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82% E7% 89% 88Java% E8% A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5% 85% A5% E9% 96% 80-% E7% B5 % 90% E5% 9F% 8E-% E6% B5% A9 / dp / 4797327030) JavaScript-Entwurfsmuster
Recommended Posts