HTML

Friss topikok

Linkblog

Design patterns 1. Singleton

2010.11.10. 19:09 6aIL6ec

Az okoskodásaimat a tervezési mintákkal kezdeném (Design Patterns).

Tulajdonképpen a design pattern egyveleg nem más, mint egy újrahasznosítható problémamegoldások halmaza. Az igaz, hogy a kódolásnál fellépő problémák/megoldásra szoruló helyzetek száma közelít a végtelenhez, viszont az is igaz, hogy minden egyes probléma több, kisebb problémára redukálható. Így ezen redukció lévén eljuthatunk egy olyan szintig, amelyre már valaki valamikor írt egy megoldást. Ami ezesetben valamely design pattern.

Részletesebben most nem merülök bele a patternek elemzésébe, csoportosításába, etc. Inkább a gyakorlati alkalmazásukkal foglalkoznék - milyen esetben milyen mintát szükséges alkalmazni.

A Singleton mintával kezdeném.

Mikor alkalmazzuk: amikor egy adott osztály példányából csak egy darabra van szükségünk. Konkrét eset: egy adatbázis kapcsolatot reprezentáló objektum (nevezzük el Database -nek). 

Ha van egy Database példányunk létrehozva valahol, ami ugye tartalmazza magát a megnyított kapcsolatot, esetleg korábban lefutott queryt vagy annak eredményét, minek hozzuk létre még egyszer - nagy valószínüséggel nem lesz szükségünk még egy vagy több nyított adatbázis kapcsolatra - csak a szervert terhelnénk vele.

Íme az osztályunk:

 

/**
* @author  6aIL6ec      
*      
* Adatbáziskapcsolatot reprezentáló osztály      
*      
*/   
   
class Database{              
  /**         
  *  A konstruktor         
  */

  public function __construct(/* paraméterek */){            
   /*
   * kapcsolat létrehozésa, etc.          
   */ 
       
  }                
   /*        
    * További metódusok        
    */
     
}

 Az első feladat ugye az, hogy ne engedjük a példányosítást. Megoldás: privátként deklaráljuk a konstruktort:

 

/**
* @author  6aIL6ec      
*      
* Adatbáziskapcsolatot reprezentáló osztály      
*      
*/   
   
class Database{              
  /**         
  *  A konstruktor         
  */

  private function __construct(/* paraméterek */){            
   /*
   * kapcsolat létrehozésa, etc.          
   */ 
       
  }                
   /*        
    * További metódusok        
    */
     
}

Ez eddig ok, de hogy érjük el a konstruktort abban az egy esetben, amikor szükség van rá? Megoldás: az osztályon belülről hívjuk meg egy osztályszintű (static) metódusból, amit publikusként deklaráljuk.

 

/**
* @author  6aIL6ec      
*      
* Adatbáziskapcsolatot reprezentáló osztály      
*      
*/   
   
class Database{              
  /**         
  *  A konstruktor         
  */

  private function __construct(/* paraméterek */){            
   /*
   * kapcsolat létrehozésa, etc.          
   */
 

  }
  /**
  * Ezen metóduson belül példányosítjuk a Database-t
  */

  public static function getInstance(/* paraméterek */){
    $theOneInstance = new Database(/*paraméterek*/);
    return $theOneInstance;
  }              
   /*        
    * További metódusok        
    */
     
}

 Továbbá meg kell valósítanunk azt, hogy a konstruktor csak akkor fusson le, amikor szükség van rá. Megoldás: osztály szinten tároljuk azt az egy példányt, amit szintén privátként deklaráljuk, így csak a publikus metódusal érhetjük el a Database példányát

 

/**
* @author  6aIL6ec      
*      
* Adatbáziskapcsolatot reprezentáló osztály      
*      
*/   
   
class Database{  
  /*
  * Ide tároljuk az egy példányt
  */

  private static $theOneInstance;
            
  /**         
  *  A konstruktor         
  */

  private function __construct(/* paraméterek */){            
   /*
   * kapcsolat létrehozésa, etc.          
   */
 

  }
  /**
  * Ezen metóduson belül példányosítjuk a Database-t
  */

  public static function getInstance(/* paraméterek */){
    /*
     * annak vizsgálata, hogy van-e már létező példányunk
     * ha nincs, akkor és csak akkor futtassuk a konstruktort
     */

    if(!isset(self::$theOneInstance)){
      self::$theOneInstance = new Database(/*paraméterek*/);
    }
    return self::$theOneInstance;
  }              
   /*        
    * További metódusok        
    */
     
}

Az egy példány védelmét azzal is fokozhatjuk, hogy a klónozást megakadályozzuk:

/**
* @author  6aIL6ec      
*      
* Adatbáziskapcsolatot reprezentáló osztály      
*      
*/   
   
class Database{  
  /*
  * Ide tároljuk az egy példányt
  */

  private static $theOneInstance;
            
  /**         
  *  A konstruktor         
  */

  private function __construct(/* paraméterek */){            
   /*
   * kapcsolat létrehozésa, etc.          
   */
 

  }
  /**
  * Ezen metóduson belül példányosítjuk a Database-t
  */

  public static function getInstance(/* paraméterek */){
    /*
     * annak vizsgálata, hogy van-e már létező példányunk
     * ha nincs, akkor és csak akkor futtassuk a konstruktort
     */

    if(!isset(self::$theOneInstance)){
      self::$theOneInstance = new Database(/*paraméterek*/);
    }
    return self::$theOneInstance;
  }  
  /*
  * klónozás megakadályozása
  */

 
public function __clone(){
     trigger_error('Az osztály nem klónozható!', E_USER_ERROR);
  }
            
   /*        
    * További metódusok        
    */
     
}

 Így elértük a célunkat - a Database osztály példányát csak a következőképp hívhatjuk

$databaseInstance = Database::getInstance();  Folyt köv.
 



Szólj hozzá!

Címkék: design php database pattern singleton

A bejegyzés trackback címe:

https://elephpantfan.blog.hu/api/trackback/id/tr502439194

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása