Flyweight tasarım deseni, sık kullanılan nesnelerin bellek yönetimini kontrol etmek için kullanılan bir tasarım desenidir.
Bu kalıbın amacı aynı nesneleri bellekte çokça oluşturmak yerine her bir nesnenin bir kopyasını oluşturmak ve oluşturulan nesneleri ortak bir havuzda tutup istenildiği taktirde havuzdan nesnenin seçilip verilmesine dayanır.
Bu tasarım desenine ait UML diyagramı aşağıdaki gibidir.
Flyweight: Nesnenin ortak özelliklerini tutan yapıdır. Interface de olabilir abstract class da.
ConcreteFlyweight: Flyweight şablonunu uygulayan farklı nesneleri içeren sınıflardır.
FlyweightFactory:Flyweight havuzunu tutacak sınıftır, eğer daha önceden nesne oluşturulmamışsa havuza atılacak oluşturulmuş ise de havuzdan seçilip verilecektir.
Yukarıdaki UML diyagramına bakıldığı zaman intrinsic gibi kavramlar göze çarpacaktır. Herbir Flyweight nesnesi temel olarak iki veri kümesinden oluşur. Dahili (intrinsic) olarak geçen durum-bağımsız (state-independent) kısım parçalardan birisir. Bu kısımda, çalışma zamanındaki tüm Flyweight nesneleri tarafından saklanan paylaşılmış alanlar yer almaktadır. Diğer parça ise durum-bağımlı (state-dependent) olarak bilinen ve dışsal(extrinsic) olarak belirtilen kısımdır. Bu kümedeki veriler ise istemci tarafından saklanır, hesap edilir ve Flyweight nesne örneğine, yine Flyweight'in bir operasyonu yardımıyla aktarılırlar.
Senaryo olarak oyunda bir sahne tasarlandığını ve sahne arka planında bulunan kutuların rastgele yerleştirdiğini varsayalım. Burada kutuların değişen tek şeyi renk ve konumları olacaktır.
// Nesnenin ortak özelliklerini tutan sınıftır.// UML diyagramındaki Flyweight yapısına denk gelmektedir.abstractclassBox{ // Intrinsic değerler.publicint width;publicint height;publicBoxColor boxColor;publicabstractvoidDraw(int locationX,int locationY);}