CHAPTER 6 생성 디자인 패턴
6.1 싱글턴 패턴 (1)
6.1.1 싱글턴 패턴의 정의
어떤 클래스의 객체 또는 인스턴스를 단 하나만 생성할 수 있다면, 해당 클래스는 싱글턴 클래스이며, 이 디자인 패턴을 싱글턴 패턴이라고 한다
클레스안에 시스템에 한 번만 저장되어야 하는 데이터가 포함된 경우 해당 클래스는 싱글턴 클래스로 설계해야 한다
6.1.2 싱글턴 패턴의 구현
- 즉시 초기화
- 늦은 초기화
- 이중 잠금
- 홀더에 의한 초기화
6.1.4 싱글턴 패턴의 단점
- 클래스 간의 의존성을 감춘다
- 코드의 확장성에 영향을 미친다
- 코드의 테스트 용이성에 영향을 미친다
- 매개변수가 있는 생성자를 지원하지 않는다
의존성 주입을 통해 해결해 보는것도 대안이다
6.2 싱글턴 패턴 (2)
6.2.1 싱글턴 패턴의 유일성
싱글턴 객체의 유일성이 가지는 범위는? 스레드? 프로세스?
싱글턴 객체의 유일성이 영향을 미치는 범위는 프로세스 내로 한정
6.2.2 스레드 전용 싱글턴 패턴
- 스레드 안에서 유일 : 스레드 하나하나 마다 유일함
- 프로세스에서 유일 : 같은 프로세스에 속한 모든 스레드에서 유일
6.2.3 클러스터 환경에서의 싱글턴 패턴
- 클러스터에서 유일 : 같은 클러스터에 속한 여러 프로세스에서 유일
6.2.4 다중 인스턴스 패턴
- 클래스가 여러개 생성될수 있지만 생성할 수 있는 개수가 제한되어 있음을 의미
- 팩터리 패턴과 유사
6.3 팩터리 패턴 (1)
- 단순 팩터리 패턴(simple factory pattern)
- 팩터리 메서드 패턴(factory method pattern)
- 추상 팩터리 패턴(abstract factory pattern)
6.3.1 단순 팩터리 패턴
분기 판단 논리 명령문이 모여 있는데 이 코드를 다형성이나 다른 디자인 패턴으로 대체해야 할지 고민이 될 수도 있다 하지만 if 분기가 매우 많은게 아니라면 if 분기가 있어도 된다
6.3.2 팩터리 메서드 패턴
팩터리 메서드 패턴은 단순 팩터리 패턴보다 개방 패쇄원리에 더 가깝다
코드가 충분히 단순하면 단순 팩터리 패턴으로 충분하며 팩터리 메서드 패턴을 사용할 필요가 없다
6.3.3 추상 팩터리 패턴
팩터리가 한가지 유형의 만드는 대신 다양한 유형을 만들게 하는것
6.3.4 팩터리 패턴의 적용 대상
- 규칙 설정 분석과 유사하게 코드에 if 분기 판단 논리가 있으며 유형에 따라 다른 객체를 동적으로 생성하는 경우
- 유형에 따라 다른 객체를 생성할 필요는 없지만 단일 객체 자체의 생성 프로세스가 비교적 복잡한 경우
6.4 팩터리 패턴 (2)
팩터리 패턴은 의존성 주입 컨테이너에서 널리 사용된다
6.4.1 DI 컨테이너와 팩터리 패턴의 차이
DI 컨테이너는 팩터리 패턴의 확장이다
DI 컨테이너는 많은 객체를 담을수 있어서 컨테이너라고 불린다
6.4.2 DI 컨테이너의 핵심 기능
- 설정 분석
- DI 컨테이너가 생성해야 하는 객체를 알려주는 도구가 설정이다
- 객체 생성
- 리플렉션을 통해서 객체 생성
- 객체 수명 주기 관리
- spring framework의 bean scope
- scope를 통해서 객체의 수명 주기를 관리
- 지연 적재를 lazy-init 속성으로 관리
- spring framework의 bean scope
6.5 빌더 패턴
생성기 패턴
6.5.1 생성자를 사용한 객체 생성
매개 변수 목록이 많아지면 가독성과 사용 편의성이 나빠진다
6.5.2 setter 메서드를 사용한 멤버 변수 설정
코드의 가독성과 편의성이 증가 된다
6.5.3 빌더 패턴을 이용한 매개변수 검증
- 필수 항목이 매우 많다면 생성자 매개 변수로 지정해야 되는데 가독성과 사용편의성 문제가 생긴다
- 설정 사이에 의존성이 존재 할때
- 클래스의 객체가 불변 객체여야 한다면
6.5.5 빌더 패턴과 팩터리 패턴의 차이
팩터리 패턴은 동일한 상위 클래스나 인터페이스를 상속하는 하위 클래스 그룹과 같이 유형은 다르지만 연관되어 있는 객체를 생성할 때 사용되며,
어떤 유형의 객체를 생성할지는 미리 지정된 매개변수에 의해 결정된다
빌더 패턴은 동일한 유형의 복잡도 높은 객체를 생성하는데 이때 선택적 매개변수를 설정하거나 사용자 정의를 통해 다른 객체를 생성한다
6.6 프로토타입 패턴
6.6.1 프로토타입 패턴의 정의
객체의 생성 비용이 비교적 크지만 동일한 클래스 기반으로 생성된 차이가 그리 크지 않은 객체를 생성할 경우
생성시간을 절약하기 위해 기존 객체인 프로토타입을 사용하여 복사를 통해 새 객체를 생성한다.
이렇게 프로토타입을 기반으로 객체를 생성하는 방식을 프로토타입 패턴이라고 한다
- 깊은 복사 : 객체의 모든 멤버 변수를 복사
- 얕은 복사 : 객체의 주소값만 복사