Study/computer science

생성패턴 - 싱글톤패턴/팩토리패턴

오후 6시의 봄 2024. 1. 7. 13:32
싱글톤패턴
  • 하나의 클래스에 단 하나의 인스턴스만 가지는 패턴
  • I/O bound(데이터베이스 연결 모듈 등)에 많이 사용
    ex) mysql pool instance 사용
  • 장점 : 인스턴스를 생성할 때 드는 비용이 줄어들음 
  • 단점 : 의존성이 높아지고 TDD 단위테스트 시 걸림돌이 됨 
    (모듈의 순서를 변경하여 테스트할 때 다른 인스턴스에 영향을 미침)
싱글톤패턴 구현방법
  1. 단순한 메서드 호출
    • 인스턴스 생성여부를 확인하고 없으면 인스턴스 생성하여 반환
    • 원자성이 결여되어 멀티스레드로 돌아갈 때 문제가 생길 수 있음
  2. synchronized
    • 위를 보완하기 위해 순서보장 로직 추가
    • 인스턴스를 호출할 때 마다 스레드에 락이 걸리기 때문에 성능저하가 됨
  3. 정적 멤버/정적 블록
    • 위를 보완하기 위해 static을 사용
    • 클래스 로딩과 동시에 싱글톤 인스턴스를 만들고 모듈이 요청시 만들어진 인스턴스를 반환하기만 하면 됨
    • 인스턴스가 필요없는 경우에도 생성하는 케이스가 있어 자원 낭비일 때가 있음
  4. 정적 멤버와 Lazy Holder(추천)
    • 위를 보완하기 위해 내부 클래스를 추가 생성하여 호출될 때 클래스를 로딩시킴
  5. 이중 확인 잠금
    • 인스턴스가 없을 때만 synchronized를 걸어 이중 확인을 하고 락을 걸어줌
    • 캐시메모리가 아닌 메인메모리에서 같은 변수를 사용하게 함(volatile)
  6. enum 사용(추천)
    • 기본적으로 스레드세이프하기 때문에 사용할 수 있음
    • 이펙티브 자바의 저자가 추천한 방법

팩토리패턴
  • 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고,
    하위 클래스가 객체 생성에 관한 구체적인 내용을 결정하는 패턴
  • 상위 클래스는 유연성을 갖고, 하위 클래스는 유지보수성이 증가