프로그래밍/OOP_Pattern_TDD

디자인패터 플라이웨이트 패턴 (Flyweight pattern)

라이프노트 2022. 8. 1. 11:40

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

 

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


기본 설계

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("동일객체");