Merhaba Java dostları,
Bir tasarım şablonu ile daha beraberiz. Bu yazımda flyweight design pattern anlatmaya çalışacağım. Aslında adından anlaşıldığı gibi bazı şeyleri hafifletmeye çalışıyoruz. Peki ne diye soracak olursanız, vereceğim cevap oluşturulan obje sayısı olacaktır. Böylece performans artışı elde etmeye çalışıyoruz. Bu konu ile ilgili olarak bir nevi pool mantığını düşünebiliriz. Arka tarafta tuttuğumuz bazı objeleri gerektiğinde çağırıyoruz. Böylece boşuna yeniden yeniden obje oluşturmuyoruz. Bu şablonu kullanırken bir kriterimiz de şu olabilir; obje üzerinde ayırt edici ve özelleştirilebilir özellikler varsa, bu ayırt edici özellikler üzerinden yine bu şablon kullanılabilir. Java içerisinde de bunun örnekleri var. Integer, Boolean vb sınıfları üzerindeki valueOf metotları bu şablonu kullanmaktadır. İsterseniz örneğimize geçelim. Bu örneğimizde bir oyun yazdığımızı düşünüyoruz. Düz bir yol boyunca koşan kahramanımız bazı engeller ile karşılaşıyor.
Şimdi bu engelleri koyalım.
package designpattern.flyweight; public class Obstacle { } |
package designpattern.flyweight; public class Rock extends Obstacle { } |
package designpattern.flyweight; public class Water extends Obstacle { } |
package designpattern.flyweight; public class Pit extends Obstacle { } |
package designpattern.flyweight; import java.util.HashMap; import java.util.Map; public class RoadRunner { private Obstacle[] road = new Obstacle[10000]; private Map<String, Obstacle> map = new HashMap<String, Obstacle>();public void fillRoad() { int counter = 0; for (int i = 0; i < road.length; i++) { int mode = i % 4; switch (mode) { case 1: road[i] = new Rock(); counter++; break; case 2: road[i] = new Water(); counter++; break; case 3: road[i] = new Pit(); counter++; break; } } System.out.println(counter + ” objects created…”); }public void fillRoadWithFlyweight() { int counter = 0; for (int i = 0; i < road.length; i++) { int mode = i % 4; switch (mode) { case 1: if (!map.containsKey(“Rock”)) { map.put(“Rock”, new Rock()); counter++; } road[i] = map.get(“Rock”); break; case 2: if (!map.containsKey(“Water”)) { map.put(“Water”, new Water()); counter++; } road[i] = map.get(“Water”); break; case 3: if (!map.containsKey(“Pit”)) { map.put(“Pit”, new Pit()); counter++; } road[i] = map.get(“Pit”); break; } } System.out.println(counter + ” objects created…”); }} |
package designpattern.flyweight;public class FlyweightMain {public static void main(String[] args) { RoadRunner runner = new RoadRunner(); runner.fillRoad(); runner.fillRoadWithFlyweight();}} |
Kahramınımızın yolunu iki farklı yöntemle dolduruyoruz. İlk yöntemde klasik olarak döngü boyunca new ediyoruz. İkinci yöntemde ise arkada bir havuz kullanıyoruz. Çıktılarımıza baktığımızda aradaki farkı göreceksiniz.
7500 objects created…
3 objects created…
Aradaki fark ve performansı siz takdir edin...
Bol Java’ lı günler dileğiyle
Yazan: Faruk BOZAN