빌더패턴

- 복잡한 객체들을 단계별로 생성할 수 있게 하는 패턴
- 많은 필드를 초기화해야 하는 복잡한 객체
- 클래스에서 객체 생성 코드를 빼서 Builder 클래스로 만듬
- 다양한 종류의 빌더를 만들어 다른 방식으로 객체를 생성할 수 있음
//객체 생성에 필수적으로 필요한 매개변수는 빌더 생성시 전달함
UserBuilder userBuilder = new UserBuilder("jang","jidam");
//빌더의 build 메소드로 User 객체를 생성함
User user = userBuilder.build();
//빌더의 세터를 통해 필요한 정보를 추가하며 객체를 생성함
user = userBuilder.setAddress("서울시 강동구").build();
빌더는 필드로 생성하려는 객체의 필드값을 가짐
class UserBuilder implements Builder {
// 빌더는 생성하려는 객체의 필드값을 가짐
private String firstName;
private String lastName; private String address
...
// 빌더의 생성자에서 필수 매개변수는 필요로함
public UserBuilder(String firstName, String LastName) { .. }
// set 메소드로 빌더의 필드들을 초기화함 . 자기자신 this를 반환함
public UserBuilder setAddress(String adr) { this.address = adr; return this; }
//build 메소드로 빌더의 필드값들을 이용해 객체를 생성함 User의 생성자를 호출함
public User build() {
return new User(firstName, lastName, address , ... );
} }
팩토리 메소드 패턴

- new로 객체생성 하는것을 팩토리 메소드로 대체함(팩토리 메소드 내에서 new로 생성)
- Creator의 createProduct가 팩토리 메소드임. 반환형은 Product(생성하려는 객체들의 공통 인터페이스)
- 각 ConcreteCreator가 각 ConcreteProduct를 생성함
- 각 Product는 공통 인터페이스를 구현함
- 내 코드와 작동해야 하는 객체들의 정확한 의존관계를 미리 알 수 없는 경우 사용함
- 생성 코드, 사용 코드를 분리함
- 새로운 클래스를 추가하기 수월함
추상 팩토리 패턴

- 생성하려는 객체의 패밀리(의자, 소파, 커피테이블)과 각 객체의 스타일(빅토리안, 모던)이 있음
- 패밀리의 각 요소에 해당하는 인터페이스를 선언
- 각 스타일은 인터페이스를 구현

- 추상 팩토리 인터페이스를 선언
- 팩토리는 패밀리의 각 객체를 생성함
- 인터페이스를 구현해 각 디자인에 맞는 패밀리 멤버들을 생성할 수 있게함

- 클라이언트는 추상적인 인터페이스를 통해 기능을 활용함
- 코드가 다양한 패밀리와 작동해야 하는데 , 구상 클래스에 의존하고 싶지 않을 떄 사용함