플라이웨이트 패턴과 싱글톤 패턴은 모두 객체 생성을 최적화하는 구조적 디자인 패턴입니다. 그러나 두 패턴의 목적과 구현 방법, 사용 시점 등에 차이가 있습니다.
- 목적
플라이웨이트 패턴: 여러 개의 객체를 공유하여 메모리 사용을 최소화하고 성능을 개선하는 것이 목적입니다. 객체의 내부 상태는 불변(immutable)적이어야 하며, 내부 상태가 동일한 객체는 공유됩니다.
싱글톤 패턴: 전체 시스템에서 단 하나의 객체만 생성하여 사용하는 것이 목적입니다. 모든 클라이언트는 동일한 객체 인스턴스에 접근합니다. - 구현 방법
싱글톤 패턴: 객체를 생성하는 생성자를 private으로 선언하여 외부에서 직접 객체를 생성할 수 없도록 합니다. 객체를 생성하는 정적 메서드를 제공하고, 이 메서드에서 객체가 이미 생성되어 있는지 검사한 후, 이미 생성되어 있다면 그 객체를 반환합니다.
플라이웨이트 패턴: 객체를 공유하기 위한 팩토리 클래스를 생성하고, 객체를 생성하는 메서드에서 이미 생성된 객체가 있는지 검사한 후, 이미 생성된 객체가 있다면 그 객체를 반환합니다. - 사용 시점
싱글톤 패턴: 전체 시스템에서 단 하나의 인스턴스를 유지해야 하는 경우에 사용됩니다. 예를 들어, 로깅 객체, 데이터베이스 연결 객체 등이 있습니다.
플라이웨이트 패턴: 객체가 동일한 내부 상태를 가지며, 이 상태를 공유할 수 있는 경우에 사용됩니다. 예를 들어, 글자나 이미지 등의 그래픽 객체, 쓰레드 풀 등이 있습니다.
따라서, 플라이웨이트 패턴과 싱글톤 패턴은 객체 생성을 최적화하기 위한 목적은 비슷하지만, 그 방식과 사용 시점 등에 차이가 있습니다.
플라이웨이트 패턴 구현
- 인터페이스 생성
객체들이 공유해야할 메서드 생성
'''
public interface Flyweight {
void operation();
}
'''
- 플라이웨이트 객체 생성
공유할 내부 상태를 가지는 객체 생성. Immutable이여야 하며, 공유할 수 있는 상태를 가짐.
'''
public class ConcreteFlyweight implements Flyweight {
private final String intrinsicState;
}this.intrinsicState = intrinsicState;
}System.out.println("ConcreteFlyweight: " + intrinsicState);
} - public void operation() {
- public ConcreteFlyweight(String intrinsicState) {
'''
- 팩토리 클래스 생성
이미 생성된 객체가 있는지 체크.
'''
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;
}
}
'''
- 클라이언트 코드
팩토리 클래스를 이용하여 객체 생성
'''
public class Client {
public static void main(String[] args) {}
} 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;
}
}
'''
'프로그래밍언어' 카테고리의 다른 글
JAVA 참조 유형과 관련된 자료구조 (0) | 2023.04.05 |
---|---|
java8이전과 이후의 garbage collector의 동작과 종류 (0) | 2023.03.26 |
CPU L1, L2 캐시와 자바 volatile (0) | 2023.02.18 |
자바의 Object Class (0) | 2023.02.10 |
deep copy, shallow copy, String, Heap, Stack, Immutable, mutable (0) | 2023.02.10 |