PSD( Private-Self-Development )

플라이웨이트 패턴 본문

Backend/디자인패턴

플라이웨이트 패턴

chjysm 2023. 5. 23. 15:13

플라이웨이트 패턴? 

각 객체를 그때 그때 생성하는 것이 아닌 하나의 객체를 공유 사용하여 자원 소모를 줄이는 패턴이다.

말 그대로 가벼운 무게 즉 자원 소모가 적다는 뜻 

 

여기서 플라이웨이트 패턴으로 공유되는 객체는 

"본질적 상태"를 가진 객체여야 하고 이를 "본질적 공유" 라 한다.

 

본질적 상태? 부가적 상태?

본질적 상태란 어떠한 변경도 없이 객체를 있는 그대의 상태 즉 불변성을 만족하는 상태 

부가적 상태란 반대로 상태값에 따라 객체가 달라지는 것 가변성

 

플라이웨이트 패턴 장점 

  • 자원 소모를 줄일 수 있다.

 

플라이웨이트 패턴 단점

  • 코드가 복잡해진다.

 

플라이웨이트 패턴의 구현

public interface SharedObject {
    void print();
}

public class SharedObject1 implements SharedObject{
    @Override
    public void print() {
        System.out.println("SharedObject1");
    }
}

public class SharedObject2 implements SharedObject{
    @Override
    public void print() {
        System.out.println("SharedObject2");
    }
}

public class SharedObjectFactory {
    private static final HashMap<String, SharedObject> pools = new HashMap<>();

    public static SharedObject getObject(String name){
        try {
            synchronized(SharedObjectFactory.class){
                if( pools.get(name) == null ){
                    pools.put(name, (SharedObject) Class.forName(name).getDeclaredConstructor().newInstance());
                }
            }
            return pools.get(name);
        }catch (Exception e){
            e.printStackTrace();
        }

        return null;
    }    
}

// 사용 예
public static void main(String[] args) {
    SharedObject test1 = SharedObjectFactory.getObject("com.alcherainc.mowgli.SharedObject1");
    SharedObject secondTest1 = SharedObjectFactory.getObject("com.alcherainc.mowgli.SharedObject1");
    System.out.println(test1 == secondTest1);
}

 

언제 사용해야 할까?

  • 비슷한 객체를 너무 많이 생성하여 자원이 낭비되는 경우

 


참조

https://refactoring.guru/ko/design-patterns/flyweight

'Backend > 디자인패턴' 카테고리의 다른 글

방문자 패턴  (0) 2023.05.31
명령 패턴  (0) 2023.05.30
파사드 패턴  (0) 2023.05.23
장식자 패턴  (0) 2023.05.22
복합체 패턴  (0) 2023.05.19