Özdeş Nesne

Yaratılması pahalı bir çok işlem yapan bir nesneyi taklit eden bir başka nesnenin kullanılmasıdır. Örneğin bir nesne yarattığımızda veya bir nesnenin bir yordamını çağırdığımızda, bu çağırım bellekte çok yer tutan daha başka bir çok nesne yaratabilir veya ağa bağlanma, veritabanından büyük bir veri alma gibi pahalı işlemler yapabilir. Fakat uygulamanın akışına göre, bu işlemleri gerçekten yapmaya ihtiyaç olmayabilir. İşte bu durumlarda, bu pahalı işlemlerden doğan zaman ve kaynak kayıplarını önlemek için özdeş nesne kullanılır. Gerçekten bu pahalı işlem çağırılırsa, gerçek nesne oluşturulup, bu pahalı işlemler ihtiyaç olduğunda yapılır. Bu tasarım deseni kullanılarak, sisteme yük getiren gereksiz pahalı işlemler önlenir, böylece sistem daha hızlı ve sağlıklı hale gelir.

Örnek :

Özdeş nesne tasarım deseni örneğinde, bir görüntü dosyasının sabit diskten yüklenip de görüntülenmesi işlemi vardır. Fakat bu pahalı ve zaman alıcı bir işlemdir. GerçekGörüntüDosyası sınıfında görüldüğü gibi, dosya oluşurken, sabit diskten de yüklenmektedir. Dışarıdan görüntü dosyasını gösterme işlemi sırasında da, belleğe yüklenmiş bu dosya gösterilmektedir. İstemci sınıf konumunda olan GörüntüGösterici sınıfı incelendiğinde dosya1 ve dosya2 dosyaları görüntülenmekte, fakat dosya3 dosyası görüntülenmemektedir. Bu yüzden bu görüntü dosyası boşuna sabit diskten yüklenmiştir. Bunu önlemek için gerçek görüntü dosyasının özdeşi olan ÖzdeşGörüntüDosyası sınıfı kullanılmaktadır. Bu sınıfta görüldüğü gibi, görüntü gösterme çağırılmadan, görüntü dosyadan yüklenmemektedir. Böylece zaman ve kaynaktan kazanılmıştır.

Örnek Sınıf Çizelgesi :

Örnek Java Kodu : ( Kodlar java 1.6.0.7 ile derlenip, çalıştırılmıştır. )

GörüntüDosyası.java :

public abstract class GörüntüDosyası {

protected String dosyaİsmi;


public GörüntüDosyası( String dosyaİsmi ) {

this.dosyaİsmi = dosyaİsmi;

}


public abstract void görüntüyüGöster();

}

GerçekGörüntüDosyası.java :

public class GerçekGörüntüDosyası extends GörüntüDosyası {


public GerçekGörüntüDosyası( String dosyaİsmi ) {

super( dosyaİsmi );

görüntüDosyasınıSabitDisktenYükle();

}


private void görüntüDosyasınıSabitDisktenYükle() {

// Pahalı ve zaman alıcı bir işlem.

System.out.println(

"Görüntü dosyası sabit diskten yüklendi." );

}


@Override

public void görüntüyüGöster() {

System.out.println( "Görüntü dosyası görüntülendi." );

}

}

ÖzdeşGörüntüDosyası.java :

public class ÖzdeşGörüntüDosyası extends GörüntüDosyası {

private GörüntüDosyası dosya;


public ÖzdeşGörüntüDosyası( String dosyaİsmi ) {

super( dosyaİsmi );

}


@Override

public void görüntüyüGöster() {

if ( dosya == null ) {

// Yalnızca istendiğinde çalıştır.

dosya = new GerçekGörüntüDosyası( dosyaİsmi );

}


dosya.görüntüyüGöster();

}

}

GörüntüGösterici.java :

public class GörüntüGösterici {


public static void main(String[] args) {

GörüntüDosyası dosya1 = new ÖzdeşGörüntüDosyası( "resim1" );

GörüntüDosyası dosya2 = new ÖzdeşGörüntüDosyası( "resim2" );

GörüntüDosyası dosya3 = new ÖzdeşGörüntüDosyası( "resim3" );


// Yükleme gerekli.

dosya1.görüntüyüGöster();


// Yükleme gerekli.

dosya2.görüntüyüGöster();


// Yükleme gereksiz. Çünkü daha önce "dosya2" yüklendi.

// "dosya3" hiç bir zaman yüklenmedi.

// Zaman ve kaynaktan kazanç sağlandı.

dosya2.görüntüyüGöster();

}

}