본문 바로가기
프로그래밍언어

싱글톤과 플라이웨이트 패턴

by 흰색남자 2023. 3. 13.

플라이웨이트 패턴과 싱글톤 패턴은 모두 객체 생성을 최적화하는 구조적 디자인 패턴입니다. 그러나 두 패턴의 목적과 구현 방법, 사용 시점 등에 차이가 있습니다.

  1. 목적
    플라이웨이트 패턴: 여러 개의 객체를 공유하여 메모리 사용을 최소화하고 성능을 개선하는 것이 목적입니다. 객체의 내부 상태는 불변(immutable)적이어야 하며, 내부 상태가 동일한 객체는 공유됩니다.

    싱글톤 패턴: 전체 시스템에서 단 하나의 객체만 생성하여 사용하는 것이 목적입니다. 모든 클라이언트는 동일한 객체 인스턴스에 접근합니다.

  2. 구현 방법
    싱글톤 패턴: 객체를 생성하는 생성자를 private으로 선언하여 외부에서 직접 객체를 생성할 수 없도록 합니다. 객체를 생성하는 정적 메서드를 제공하고, 이 메서드에서 객체가 이미 생성되어 있는지 검사한 후, 이미 생성되어 있다면 그 객체를 반환합니다.

    플라이웨이트 패턴: 객체를 공유하기 위한 팩토리 클래스를 생성하고, 객체를 생성하는 메서드에서 이미 생성된 객체가 있는지 검사한 후, 이미 생성된 객체가 있다면 그 객체를 반환합니다.

  3. 사용 시점
    싱글톤 패턴: 전체 시스템에서 단 하나의 인스턴스를 유지해야 하는 경우에 사용됩니다. 예를 들어, 로깅 객체, 데이터베이스 연결 객체 등이 있습니다.

    플라이웨이트 패턴: 객체가 동일한 내부 상태를 가지며, 이 상태를 공유할 수 있는 경우에 사용됩니다. 예를 들어, 글자나 이미지 등의 그래픽 객체, 쓰레드 풀 등이 있습니다.

따라서, 플라이웨이트 패턴과 싱글톤 패턴은 객체 생성을 최적화하기 위한 목적은 비슷하지만, 그 방식과 사용 시점 등에 차이가 있습니다.

플라이웨이트 패턴 구현

  1. 인터페이스 생성
    객체들이 공유해야할 메서드 생성
    '''
    public interface Flyweight {
    void operation();
    }

'''

  1. 플라이웨이트 객체 생성
    공유할 내부 상태를 가지는 객체 생성. Immutable이여야 하며, 공유할 수 있는 상태를 가짐.
    '''
    public class ConcreteFlyweight implements Flyweight {
    private final String intrinsicState;
     this.intrinsicState = intrinsicState;
    }
     System.out.println("ConcreteFlyweight: " + intrinsicState);
    }
    }
  2. public void operation() {
  3. public ConcreteFlyweight(String intrinsicState) {

'''

  1. 팩토리 클래스 생성
    이미 생성된 객체가 있는지 체크.
    '''
    import java.util.HashMap;
    import java.util.Map;

public class FlyweightFactory {
private Map<String, Flyweight> flyweights = new HashMap<>();

public Flyweight getFlyweight(String intrinsicState) {
    Flyweight flyweight = flyweights.get(intrinsicState);

    if (flyweight == null) {
        flyweight = new ConcreteFlyweight(intrinsicState);
        flyweights.put(intrinsicState, flyweight);
    }

    return flyweight;
}

}

'''

  1. 클라이언트 코드
    팩토리 클래스를 이용하여 객체 생성
    '''
    public class Client {
    public static void main(String[] args) {}
    }
  2. FlyweightFactory factory = new FlyweightFactory(); Flyweight flyweight1 = factory.getFlyweight("state1"); Flyweight flyweight2 = factory.getFlyweight("state2"); flyweight1.operation(); // ConcreteFlyweight: state1 flyweight2.operation(); // ConcreteFlyweight: state2

'''


싱글톤
더블 체킹 락킹을 이용해 간단히 구현 가능함.
'''
public class Singleton {
private static Singleton singleton;

public static Singleton getSingleton() {
    if (singleton == null) {
        synchronized (Singleton.class) {
            singleton = new Singleton();
        }
    }
    return singleton;
}

}
'''