본문 바로가기

Software Design Pattern

객체의 상태가 많을 때 초기화 방법

객체의 상태가 많을 때 초기화 방법


방법 1. 점층적 생성자 패턴(Telescoping Constructor Pattern) - 패턴은 아니고 이디엄이다. 이디엄도 패턴처럼 취급된다.


설정하려는 인자의 개수에 맞춰 생성자를 골라서 생성하면 된다.

문제점

1. 인자수가 늘어나면, 클라이언트 코드 작성이 힘들다.

2. 인자 순서가 변경되어도 컴파일 타임에 그 문제를 찾기가 어렵다.

3. 가독성이 나쁘다.


방법 2. Beans 패턴

기본 생성자를 통해서 객체를 생성한 후, Setter를 이용하여 객체의 필수 필드 뿐만 아니라 선택적 필드를 초기화 하는 방법.


setId

setName

setLevel

setGold

setCash


문제점

1. 객체 생성 과정이 한번에 끝나지 않는다.

=> 객체 일관성이 없다

2. 스레드 안정성에 추가적인 고려가 필요하다.

3. 변경 불가능한 객체도 만들 수 없다.

4. 필수 인자와 선택 인자에 대한 구분도 불가능하다.

// 문제가 많아서 지금은 절대 사용하면 안된다-_-


방법3. 빌더 패턴

점층적 생성자 패턴의 안정성 + 빈즈 패턴 가독성


setter가 builder를 리턴하는 형태로 만든다.


UserInfo ui = new UserInfo.Builder(“Chang”, “chansik.yun”).level(1).gold(1000).cash(500).build();


장점

1. 가독성이 높고, 객체 일관성이 깨지지 않는다.

2. 필수 인자에 대한 부분을 쉽게 지원 가능하다.

3. 불변 객체를 만들기도 편하다.

4. 매개 변수가 추가되어도 유연하게 추가 가능하다.


단점

1. 추가적인 메모리가 필요하다.

2. 객체를 생성하기 위해서는 먼저 빌더를 생성해야 한다.

=> 4개 이상 인자에서 고려되어야 한다.(effective c++)


빌더 패턴은 일반화 할 수 있다.


동일한 패턴은 스트링빌더를 통해서 많이 써왔다.


String str = new StringBuilder().append(“Hello”).append(true).append(“world”).toString();


지금까지 배운 공통성과 가변성 분리하는 패턴 4가지

1. 탬플릿 메소드

2. 스트레티지

3. 스테이트

4. 빌더


+ 1가지가 더 있다.