Hafif Ağırlık
Çok sayıda nesnenin sistemde olduğu durumlarda, nesne sayısının sistemde problemlere neden olmaması için kullanılan tasarım desenidir. Çünkü çok sayıda nesne kullanmanın maliyeti yüksektir. Yeni nesneler oluşturmadan mevcut nesneleri kullanma mantığına göre çalışır. Hafif ağırlık nesnelerini bir koleksiyonda tutmak gerekir. Tutulan nesnelerin durumları az ise, ortak nesnelerin sayısı azalır. Böylece bu koleksiyonun büyüklüğü de azalmış olur.
Örnek :
Örnekte bir sözcük işlemcisi, kendisine verilen bir metindeki karakterleri ekrana yazdırmakla görevlidir. Her bir karakterin ekrana yazdırma işlemi farklı olduğu için, her bir karakter için ayrı bir Karakter sınıfı yaratılacaktır. Gelen metindeki bir çok karakter ve bunların ekrana yazdırılma işlemleri aynı olduğundan, okunan her bir karakter için ayrı sınıf oluşturmak sisteme yük getirir. Bunun yerine KarakterYaratıcısı ismindeki yaratıcı sınıf karakterleri bir havuzda tutmaktadır. İstemci sınıf olan Sözcükİşlemcisi sınıfı da her okuduğu karakter için ilk önce havuza bakmaktadır. Havuzda bulursa, bu hazır nesneyi kullanmakta, bulamazsa da yeni bir nesne yaratıp bunu kullanmaktadır. Tabi yeni yarattığı nesneyi de, ileriki kullanımlar için tekrar havuza koymaktadır.
Örnek Sınıf Çizelgesi :
Örnek Java Kodu : ( Kodlar java 1.6.0.7 ile derlenip, çalıştırılmıştır. )
Karakter.java :
public class Karakter {
private char karakter;
public Karakter( char karakter ) {
this.karakter = karakter;
}
public void ekranaBas() {
System.out.println( "Ekrana basıldı: " + karakter );
}
}
KarakterYaratıcı.java :
import java.util.HashMap;
import java.util.Map;
public class KarakterYaratıcı {
private Map < Character,Karakter > karakterHavuzu
= new HashMap < Character, Karakter >();
public Karakter karakterAl( char karakter ) {
// Havuzda varsa onu dön.
if ( karakterHavuzu.containsKey( karakter ) ) {
return karakterHavuzu.get( karakter );
}
// Havuzda yoksa, yeni oluştur bunu dön,
// havuza da ileriki kullanımlar için ekle.
Karakter yeniKarakter = new Karakter( karakter );
karakterHavuzu.put( karakter, yeniKarakter );
return yeniKarakter;
}
}
Sözcükİşlemci.java :
public class Sözcükİşlemci {
public static void main(String[] args) {
String satır = "Merhaba, nasılsın?";
KarakterYaratıcı karakterYaratıcı =
new KarakterYaratıcı();
// Satırdaki her bir bilgiyi ekrana bas.
for ( char c : satır.toCharArray() ) {
Karakter karakter = karakterYaratıcı.karakterAl( c );
karakter.ekranaBas();
}
}
}