java Flyweight pattern 실습해보기

오늘은 자바로 flyweight 패턴을 실습해보았습니다.

이 패턴은 객체들을 공유하여 메모리 사용량에 초점을 둔 패턴이며,

대체로 공유되어도 되는 객체를 많이 생성할 때, 이 패턴으로 설계하면 유리하다고 합니다.

객체를 공유하는 유사 패턴으로는 싱글톤 패턴도 있습니다.

코드

아래 코드는 자바 코드를 처음 실행할 때는 만들어지고 두번 실행하면 실행만 되는 예시로 작성했습니다.

public interface Iexe {

	public void exe();
}

먼저 인터페이스를 만들어서 실행 메소드를 추상화해줍니다.

public class Java implements Iexe {

	public Java(){
		System.out.println("Java created");
	}
	
	@Override
	public void exe() {
		System.out.println("execute");
	}

}

자바를 예로 들어 인터페이스로 받아들여, 생성자와 오버라이딩된 메소드를 작성합니다.

생성자는 해당 객체가 생성될 때만 실행되고, 오버라이딩한 메소드는 실행할 때 무조건 출력됩니다.

import java.util.HashMap;

public final class Factory {
	
	private HashMap<String, Java>map = new HashMap<String, Java>();
	
	public Java getInstance(String t){
		Java instance = map.get(t);
		if(instance == null && t == "JAVA"){
			instance = new Java(); 	   
			}
		map.put(t, instance);
		return instance;
	}
}

팩토리 패턴을 생각하며 공장 메소드를 만듭니다.

해시맵으로 키와 값을 각각 string, java로 설정합니다. 키로 객체를 찾아서 값을 사용하기 위함입니다.

인스턴스 getter로 싱글톤 패턴과 유사하게 키로 찾아서 값이 null, 즉 없다면 객체를 만들어서 넣어주고 반환합니다.

있다면, 그대로 넣고 반환합니다.

public class Main {

	public static void main(String[] args) {

		Factory factory = new Factory();
		
		Java test = factory.getInstance("JAVA");
		test.exe();
		test = factory.getInstance("JAVA");
		test.exe();
	}

}

메인 클래스에서는 우선 팩토리 객체를 만들어서 인스턴스를 만듭니다.

인스턴스가 생성될때마다 자바 객체가 나오면서 처음에 생성자로 실행됩니다.

두번째 실행에는 팩토리 클래스에서 if문을 넘어가면서 실행만하게 됩니다.

Written on February 19, 2018