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