Justin의 개발 로그
article thumbnail

공통으로 사용하는 클래스를 만드는 팩토리 클래스를 두고 사용 클래스의 인스턴스가 팩토리 클래스 내에 있을 시에는 꺼내서 사용하고, 없을 시에는 새로 생성해서 사용하는 패턴

 

플라이 웨이트 패턴을 통해 메모리 공간을 절약할 수 있다.


기본 설계

FlyWeight를 다루는데 Client가 직접적으로 다루지 않고, FlyWeightFactory를 통해 다루는 것을 볼 수 있다.

 

public class FlyWeightObject {
    private String name;

    public FlyWeightObject(String name) throws InterruptedException {
        System.out.println(name + " : 객체 생성에 걸리는 시간 1초");
        Thread.sleep(1000);

        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }

}
import java.util.Map;
import java.util.TreeMap;

public class FlyWeightObjectFactory {
    private Map<String, FlyWeightObject> pool;

    public FlyWeightObjectFactory() {
        this.pool = new TreeMap<>();
    }

    public FlyWeightObject getObject(String key) throws InterruptedException {
        FlyWeightObject fwObject = pool.get(key);
        if(fwObject == null) {
            fwObject = new FlyWeightObject(key);
            pool.put(key, fwObject);
        }

        return fwObject;
    }
}
public class TesterFlyweightPattern {
    public static void main(String[] args) throws InterruptedException {
        FlyWeightObjectFactory fwFactory = new FlyWeightObjectFactory();
        FlyWeightObject fwObject = fwFactory.getObject("Justin");
        System.out.println(fwObject);

        fwObject = fwFactory.getObject("Jordan");
        System.out.println(fwObject);

        fwObject = fwFactory.getObject("Anna");
        System.out.println(fwObject);

        fwObject = fwFactory.getObject("Justin");
        System.out.println(fwObject);

        fwObject = fwFactory.getObject("Justin");
        System.out.println(fwObject);

        fwObject = fwFactory.getObject("Anna");
        System.out.println(fwObject);

        fwObject = fwFactory.getObject("Jordan");
        System.out.println(fwObject);
    }
}

 

String class에 적용된 flyWeight 

        String justin1 = "Justin1";
        System.out.println("Justin1 : " + justin1.hashCode());

        String justin2 = "Justin" + "1";
        System.out.println("Justin2 : " + justin2.hashCode());

        String justin3 = new String("Justin1");
        System.out.println("Justin3 : " + justin3.hashCode());

        if(justin1.equals(justin2))
            System.out.println("동일값");

        if(justin1 == justin2)
            System.out.println("동일객체");
profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!