Bir önceki yazımda tasarım desenleri hakkında genel bilgiler sunmuştum. Ardından Factory tasarım deseninin ne işe yaradığından bahsedip, örnek kodlar paylaşmıştım. Tasarım desenleri üzerine yazılarıma devam ediyorum. Bu yazıda kurucu tasarım desenleri sınıfında bulunan Singleton tasarım deseni üzerine bilgiler paylaşacağım.
Tasarım desenlerinin ayrı başlıklar halinde incelenmesi bazı arkadaşlarda "Sadece Birini" tercih edebileceği izlenimini oluşturabiliyor. Bu yanlış bir algıdır. Örneğin Factory tasarım deseni ile Singleton tasarım deseni bir arada kullanılarak daha iyi sonuçlar elde edilebilir. Aynı şekilde birden fazla başka tasarım desenleri de birarada kullanılabilir.
Singleton tasarım deseni bir sınıfın uygulamada sadece 1 kez tanımlanarak, diğer nesnelerden ulaşılabilmesini sağlar. Çalışma mantığını özetleyecek olursak; tanımlanan bir nesneyi ram hafızasına yazıyoruz. Yeniden nesne tanımlanmaya çalışıldığında hafızada tanımlı olup olmadığını kontrol ediyoruz. Eğer daha önce tanımlanmışsa yeni bir nesne oluşturmak yerine hafızada bulunan nesneyi kullanıyoruz. Böylece olası bir çakışmayı önlediğimiz gibi, performans ve kaynak tüketimi açısından da daha iyi sonuçlar elde ediyoruz. Zira nesne tabanlı yazılımlar bilinçsizce geliştirildiğinde ciddi sorunlar ortaya çıkarabiliyor.
Bu kadar teorik bilgiden sonra kod örneklerine başlayalım. İlk olarak "Lib" isminde bir klasör oluşturalım. Bu klasör içine "Config.php" dosyası oluşturalım ve içinde "Config" isminde çok basir bir sınıf oluşturalım. (Sadece sınıf tanımlama üzerine bir örnek olduğu için, gereksiz yer kaplamaması ve kafa karıştırmaması için sınıf içinde fonksiyonlar oluşturmadım.)
Lib/Config.php :
Class Config
{
}
"Lib" klasörü dışında Singleton tasarım deseninin kodlarını yazacağımız dosyamızı oluşturalım. Ben "index.php" isminde bir dosya oluşturuyorum.
index.php :
// Yeni bir sınıf oluşturuyoruz.
Class Load
{
// Sınıfı atayacağımız statik bir değişken tanımlıyoruz.
private static $class;
/*
* Private bir kurucu fonksiyon tanımlıyoruz.
* $a = new Load; şeklinde tanımlanmasını engeller.
*/
private function __construct()
{
}
// Yeni nesne oluşturacağımız sınıf.
public static function set()
{
// Eğer $class değişkeninde değer yoksa yeni sınıf tanımlıyoruz.
if(!isset(self::$class))
{
// Sınıfı tanımlıyoruz statik değişkenimize atıyoruz.
include_once 'lib/Config.php';
self::$class = new Config;
// Çalışma mantığını görmemiz açısında burada mesaj oluşturalım.
echo 'Sınıf daha önce tanımlanmadığı için oluşturuldu.
';
}
else
{
// Çalışma mantığını görmemiz açısında burada mesaj oluşturalım.
echo 'Sınıf zaten daha önce oluşturulmuş. O yüzden hafızada bulunan objeyi geri döndürüyoruz.
';
}
// Nesneyi geriye döndürüyoruz.
return self::$class;
}
}
NOT : Bu yöntem ile sadece bir nesne için kontrol yapabiliyoruz. Daha gelişmiş bir sistem oluşturmak için statik değişkeni dizi olarak tanımlayabilirsiniz ve böylece birden fazla nesnenin kontrolünü yapabilirsiniz.