JeuWeb - Crée ton jeu par navigateur
[POO]_design pattern_Singleton - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [POO]_design pattern_Singleton (/showthread.php?tid=991)



[POO]_design pattern_Singleton - Shidame - 31-03-2007

Bonjour à ceux que ce titre un peu pompeux n'a pas rebuté et aux autres aussi par la même occasion.

Tout d'abord soyez indulgent car d'une part c'est mon premier tutorial et d'autre part car je débute dans le POO.

Alors aujourd'hui je vais vous parler...du Singleton (non ne partez pas).

Définition :
Le singleton est un design pattern, il permet d'éviter d'avoir plusieurs objets identiques, donc les ressources en mémoire. D'une autre manière, il permet d'utiliser une même instance d'un objet tout au long d'une application.

Commençons par l'exemple minimal d'un Singleton en PHP5 :
Code PHP :
<?php
class Singleton
{
private static
$_instance;

private function
__construct()
{
echo
'Vive le Singleton';
}

public static function
GetInstance()
{
if (!isset(
self::$_instance))
{
self::$_instance = new Singleton();
}
return
self::$_instance;
}
}
?>

Explications :
Code PHP :
<?php 
private static $_instance;
C'est cette variable qui va stocker l'objet que l'on souhaite instancier qu'une seule fois, puis réutiliser.
Code PHP :
<?php 
private function __construct()
{
echo
'Vive le Singleton';
}
On souhaite que la classe Singleton ne soit pas instancier à chaque fois, donc en passant le constructeur en privé on en peut l'appeler qu'à l'intérieur de la classe.
Il est donc impossible de faire :
Code PHP :
<?php 
$objet
= new Singleton();
Ceci renverra une erreur : Fatal error: Call to private objet::__construct().
Code PHP :
<?php 
public static function GetInstance()
{
if (!isset(
self::$_instance))
{
self::$_instance = new Singleton();
}
return
self::$_instance;
}
C'est dans cette méthode que réside tout le secret du pattern singleton, elle est déclarée statique ce qui lui permet d'être appelée sans avoir d'objet instancié, elle vérifie si l'attribut $_instance est déjà créé, si ce n'est pas le cas alors elle fait appel au constructeur est stocke le nouvel objet.
On utilise « self » et non pas « $this » car les accès sont défini comme statiques.
Au final GetInstance() renvoie l'objet stocké dans $_instance, ainsi :
Code PHP :
<?php 
$objet1
= Singleton::GetInstance();
$objet2 = Singleton::GetInstance();

$objet1 et $objet2 contiennent le même objet.

Utilisation courante du Singleton :
Dans le cadre de l'utilisation d'une classe de connexions à une base de donnée, il est inutile et fortement déconseiller de créer à un nouvel objet à chaque fois que l'on requiert un accès aux données.
En effet, pourquoi ne pas utiliser une connexion déjà ouverte ? C'est encore une fois grâce à la méthode singleton que l'on va y arriver.

Voici comment procéder :
Code PHP :
<?php
class MyDB
{
private static
$_instance;

public function
__construct($param)
{
// connexion à la base de donnée avec les paramètres contenu dans $param
}
public function
query($query)
{
// execution de la requête contenue dans $query
}
// etc.. pour d'autre méthode (le but ici n'étant pas d'expliquer comment faire une classe de connexion à une base de donnée)
public static function GetInstance()
{
if (!isset(
self::$_instance))
{
self::$_instance = new MyDB();
}
return
self::$_instance;
}
}
?>

Comment ça marche ?
Code PHP :
<?php 
// instancie la classe MyDB
$db = MyDB::GetInstance();
$db->query('SELECT * FROM table');
/**
* ....
plus loin dans l'appilcation
* ....
*/
// on récupère l'objet instancié précédemment donc la même connexion
$otherdb = MyDB::GetInstance();

Voilà c'est (enfin) fini, j'espère que pour vous « Singleton » n'est plus la marque d'une prothèse auditive mais un moyen pratique et simple de réutiliser un objet dans une application.

Merci de votre attention et n'hesitez pas à me critiquer et me corriger si j'ai dis des bétises.

Edit : Remplacement de "return 'vive le Singleton';" par "echo 'vive le Singleton';", sur la remarque de Teclis01, car un constructeur ne dois pas posséder de return.


RE: [POO]_design pattern_Singleton - orditeck - 31-03-2007

L'aide pour ce tutoriel ce trouve à cette adresse :
http://www.jeuweb.org/board/showthread.php?tid=1430