Les détails et autres modèles seront écrits dans ** Comprendre les modèles de conception en comparant les implémentations en JavaScript et Java **.
Le logiciel crée ou autorise généralement plusieurs instances à partir d'une classe Cependant, il y a des moments où «je ne crée qu'une seule instance de cette classe et je ne veux pas». Comme l'épée légendaire en RPG Si vous obtenez de nombreuses épées légendaires dans un jeu, un jeu en ligne, etc., la valeur diminuera.
Un putter qui garantit qu'une seule instance de ce type existe est appelé le ** modèle Singleton **.
La raison pour laquelle le constructeur est privé est de lancer une erreur lors de l'écriture de `` new Singleton () ''
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 et ojb2 sont la même instance.");
} else {
System.out.println("obj1 et obj2 ne sont pas la même instance.");
}
System.out.println("End.");
//J'obtiens une erreur lorsque je décommente ce qui suit
// Singleton obj3 = new Singleton();
}
}
Singleton.java
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {
System.out.println("Créé une instance.");
}
public static Singleton getInstance() {
return singleton;
}
}
Je pense que le résultat de l'exécution sera le suivant
Start.
Créé une instance.
obj1 et obj2 sont la même instance.
End.
Comme vous pouvez le voir ci-dessus, vous pouvez voir que l'instance a été créée la première fois que la méthode getInstance a été appelée. La classe Singleton est chargée lorsque la méthode statique getInstance est appelée.
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.");
/**
*Le livre a déclaré ce qui suit, mais je l'ai changé pour le rendre plus facile à comparer.
* var obj1 = SINGLETON.singleton
* var obj2 = SINGLETON.singleton
*/
var obj1 = SINGLETON.singleton.getInstance();
var obj2 = SINGLETON.singleton.getInstance();
if (obj1 === obj2) {
console.log("obj1 et obj2 sont la même instance.");
} else {
console.log("obj1 et obj2 ne sont pas la même instance.");
}
console.log("End.");
};
window.addEventListener("load", MAIN.init);
Singleton.js
var SINGLETON = {};
SINGLETON.singleton = (function() {
var instance;
function init() {
console.log("Créé une instance.");
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;
}
};
})();
A une méthode statique pour obtenir une seule instance Cette méthode renvoie toujours la même instance
Garantie lorsque vous ne souhaitez créer qu'une seule instance comme décrit ci-dessus De plus, l'exécution différée est importante en singleton Ne consomme pas de mémoire sauf si une instance statique est nécessaire comme raison Dans le cas de C ++, l'ordre d'initialisation dynamique est imprévisible, donc l'utilisation de singleton présente l'avantage que le programmeur peut décider lui-même du timing. En plus de vouloir n'en faire qu'un, utilisez-le pour des choses qui n'ont pas de sens même si vous pouvez en faire deux ou plus
Exemple d'utilisation Lorsque vous souhaitez utiliser une classe comme une variable globale
[Introduction aux modèles de conception appris dans le langage Java amélioré et révisé](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) Modèle de conception JavaScript
Recommended Posts