Monday, October 5, 2009

Design Pattern in Brief (5)

Flyweight

Setiap object mengandung informasi yang tersimpan dalam propertynya. Informasi tersebut bisa dibagi menjadi dua kategori yaitu informasi intrinsik dan ekstrinsik. Informasi intrinsik adalah informasi yang independen, yaitu informasi yang bersifat tetap atau konstan terhadap instance suatu class. Contohnya adalah informasi nama dan alamat perusahaan pada class kartu identitas pegawai. Informasi ekstrinsik adalah informasi yang bersifat berubah-ubah tergantung object tempat informasi tersebut berada. Hal ini berarti informasi tersebut "unique" untuk tiap instance dari class. Sebagai contoh, nama dan jabatan pegawai adalah "unique" untuk tiap pegawai.

Sekarang misalkan kita memiliki sebuah class employee yang bisa dibuat menjadi ribuan object dan di dalam class tersebut tersimpan informasi intrinsik dan ekstrinsik. Jika hal itu terjadi maka akan menimbulkan overhead pada memori karena menyimpan tiap informasi intrinsik yang sebetulnya sama bagi semua object employee tersebut. Untuk mengatasi hal inilah pattern flyweight dibuat.

Pattern flyweight menyarankan untuk memisah informasi intrinsik ke dalam object sendiri yang disebut object flyweight. Tiap object yang membutuhkan object flyweight dapat berbagi instance flyweight sehingga akan mampu menghemat memori dan waktu yang dibutuhkan untuk membuat object (object creation time).

Berikut adalah requirement yang harus dipenuhi untuk membuat flyweight :
- Hanya ada satu object flyweight dan object tersebut digunakan bersama oleh object lain yang membutuhkan.
- Object yang memanfaatkan flyweight di atas tidak boleh secara langsung membuat object flyweight.

Untuk memenuhi requirement di atas maka berikut adalah pendekatan yang dilakukan
- Class flyweight harus memiliki konstruktor private sehingga tidak bisa dibuat oleh class lain.
- Pattern singleton digunakan untuk memastikan bahwa tidak ada duplikasi object.

package edu.mat.pattern;

public interface IFlyweight {

public String getCompanyName();
public String getCompanyAddress();

}

package edu.mat.pattern;

import java.util.HashMap;
import java.util.Map;

public class FlyweightFactory {

private static final FlyweightFactory INSTANCE = new FlyweightFactory();
private Map flyweightList;

private FlyweightFactory() {
super();
this.flyweightList = new HashMap();
}

public static FlyweightFactory getInstance() {
return INSTANCE;
}

public synchronized Flyweight getFlyweight(String companyName) {
if(flyweightList.get(companyName) == null) {
Flyweight fly = new Flyweight(companyName);
flyweightList.put(companyName, fly);
return fly;
}
else
return flyweightList.get(companyName);
}

private class Flyweight implements IFlyweight {

private String companyName;
private String companyAddress;

private Flyweight(String companyName) {
super();
this.companyName = companyName;
if(companyName != null) {
if(companyName.equals("IBM"))
this.companyAddress = "California";
else if(companyName.equals("SUN"))
this.companyAddress = "Silicon Valley";
}
}

@Override
public String getCompanyAddress() {
return companyAddress;
}

@Override
public String getCompanyName() {
return companyName;
}

}

}

package edu.mat.pattern;

public class Main {

public static void main(String[] args) {
FlyweightFactory factory = FlyweightFactory.getInstance();
System.out.println(factory.getFlyweight("SUN"));
System.out.println(factory.getFlyweight("IBM"));
System.out.println(factory.getFlyweight("SUN"));
System.out.println(factory.getFlyweight("IBM"));
}
}

Saat dijalankan akan menghasilkan :

edu.mat.pattern.FlyweightFactory$Flyweight@42e816
edu.mat.pattern.FlyweightFactory$Flyweight@9304b1
edu.mat.pattern.FlyweightFactory$Flyweight@42e816
edu.mat.pattern.FlyweightFactory$Flyweight@9304b1

Perhatikan bahwa tepat hanya ada satu object flyweight untuk tiap companyName yang sama.

0 comments:

 

©2009 Stay the Same | by TNB