Tasarım Desenleri
Nesneye Dayalı Programlamada Sınıf İlişkileri Nasıl Olmalı?
Testçiler sizin düşmanınız değildir. Esas düşman yazılım hatalarıdır!
Yapısal Tasarım Desenleri

Özdeş Nesne ( Proxy ) Tasarım Deseni

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 Uygulama

Ö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.

/**
*
@author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/

package com.ilkerkonar.td.desen.ornekkodlar.proxy;

/**
* GörüntüDosyası.java
*
* Tarih bilgisi : May 24, 2014
*/
public abstract class GörüntüDosyası {

 
protected String  dosyaİsmi;

 
public GörüntüDosyası( final String dosyaİsmi ) {
   
this.dosyaİsmi = dosyaİsmi;
 
}

 
public abstract void görüntüyüGöster();
}
/**
*
@author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/



package com.ilkerkonar.td.desen.ornekkodlar.proxy;

/**
* GerçekGörüntüDosyası.java
*
* Tarih bilgisi : May 24, 2014
*/
public class GerçekGörüntüDosyası extends GörüntüDosyası {

 
public GerçekGörüntüDosyası( final 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ı ( " + dosyaİsmi + " ) sabit diskten yüklendi." );
 
}

 
@Override
 
public void görüntüyüGöster() {
   
System.out.println( "Görüntü dosyası ( " + dosyaİsmi + " ) görüntülendi." );
 
}
}
/**
*
@author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/

package com.ilkerkonar.td.desen.ornekkodlar.proxy;

/**
* ÖzdeşGörüntüDosyası.java
*
* Tarih bilgisi : May 24, 2014
*/
public class ÖzdeşGörüntüDosyası extends GörüntüDosyası {

 
private GörüntüDosyası  dosya;

 
public ÖzdeşGörüntüDosyası( final 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();
 
}
}
/**
*
@author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/



package com.ilkerkonar.td.desen.ornekkodlar.proxy;

/**
* GörüntüGösterici.java
*
* Tarih bilgisi : May 24, 2014
*/
public class GörüntüGösterici {

 
public static void main( final String[] args ) {
   
final GörüntüDosyası dosya1 = new ÖzdeşGörüntüDosyası( "resim1" );
   
final GörüntüDosyası dosya2 = new ÖzdeşGörüntüDosyası( "resim2" );

   
// 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();
 
}
}
Görüntü dosyası ( resim1 ) sabit diskten yüklendi.
Görüntü dosyası ( resim1 ) görüntülendi.
Görüntü dosyası ( resim2 ) sabit diskten yüklendi.
Görüntü dosyası ( resim2 ) görüntülendi.
Görüntü dosyası ( resim2 ) görüntülendi.

Yorumlar

Henüz bu sayfa için bir yorum yapılmamıştır.

Yorum Yaz, Düşüncelerini Paylaş

Not: Zorunlu alanlar yıldız (*) ile belirtilmiştir.

Kişisel Bilgiler

E-posta adresiniz kimse ile paylaşılmayacaktır. Gerekli olduğunda sizinle iletişim sağlamak için kullanılacaktır.

Yorum Alanı
Giriş Kontrol


Tüm java kodları "jdk1.7.0_09" ile derlenmiş ve çalıştırılmıştır.

Tüm hakları saklıdır. ©  "İlker KONAR" | İletişim: bilgi@tasarimdesenleri.com