Hazır yöntemler, en iyi uygulamaları ve doğru tasarımları açıklamanın bir yoludur. Hazır yöntemler genel programlama sorunlarına esnek bir çözüm getirir.
Üreteç yöntemi, nesnelerin çalışma anında örneklenmesini sağlar. Böyle adlandırılmasının sebebi, nesnenin "üretiminden" sorumlu olmasıdır. Üreteç yöntemi değiştirge olarak sınıf ismini alır ve onunla nesneyi oluşturur.
Örnek 1 Değiştirgeli Üreteç Yöntemi
<?php
class Örnek
{
// Değiştirgeli üreteç yöntemi
public static function üret($tür)
{
if (include_once 'Drivers/' . $tür . '.php') {
$sınıfadı = 'Driver_' . $tür;
return new $sınıfadı;
} else {
throw new Exception ('Sürücü bulunamadı');
}
}
}
?>
Bu yöntemi bir sınıf içinde tanımlarsanız sürücülerin çalışma anında yüklenmesini sağlayabilirsiniz. Örnek sınıfı bir veritabanı soyutlama sınıfı olsaydı, MySQL ve SQLite sürücülerinin yüklenmesi işlemi aşağıdaki gibi yapılabilirdi:
<?php
// MySQL sürücüsünü yükle
$mysql = Örnek::üret('MySQL');
// SQLite sürücüsünü yükle
$sqlite = Örnek::üret('SQLite');
?>
Tek örnek yöntemi, bir sınıfın tek bir örneğine ihtiyaç duyuldugu durumlarda tanımlanır. Bu duruma en genel örnek, veritabanı bağlantısıdır. Tek örnek yöntemi gerçeklenerek, tek bir nesne örneğinin başka birçok nesne tarafından erişilebilir olması sağlanabilir.
Örnek 2 - Tek Örnek İşlevi
<?php
class Örnek
{
// Sınıf örneğini bu değişkende saklayacağız
private static $nesneÖrneği;
// Private tanımlı bir kurucu,
// nesnenin doğrudan oluşturulmasını engeller
private function __construct()
{
echo 'Ben hazırım, ';
}
// Tek örnek yöntemi
public static function tekÖrnek()
{
if (!isset(self::$nesneÖrneği)) {
$c = __CLASS__;
self::$nesneÖrneği = new $c;
}
return self::$nesneÖrneği;
}
// Başka bir yöntem
public function bak()
{
echo 'bak!';
}
// Kullanıcıların örneği kopyalamasını engelle
public function __clone()
{
trigger_error('Nesnenin kopyalanmasına izin verilmez.', E_USER_ERROR);
}
}
?>
Yukarıdaki örnek Örnek sınıfının sadece tek bir örneğinin alınmasına izin verir.
<?php
// Bu işlem başarısız olur çünkü kurucu private tanımlı
$deneme = new Örnek;
// Bununla sınıfın daima tek örneği alınabilir
$deneme = Örnek::tekÖrnek();
$deneme->bak();
// Bu bir E_USER_ERROR iletisi oluşturur.
$deneme_kopyası = clone($deneme);
?>