클래스는 클라이언트에게 public 생성자 대신 정적 팩토리 메소드를 제공할 수 있는데,
여기서 정적 팩토리 메소드란 이름을 가질 수 있는 생성자? 라고 이해하면 편할 것 같습니다.
디자인 패턴에 존재하는 팩토리 메소드 패턴과 정적 팩토리 메소드는 엄연히 다른 것입니다.
정적 팩토리 메소드를 사용함으로써 얻을 수 있는 다양한 장점과 마지막으로 단점을 설명하겠습니다.
먼저 이름을 가진 생성자?를 사용함으로써 반환될 객체의 특성을 나타낼 수 있습니다.
두번째로는 매번 인스턴스를 새로 생성하지 않아도 되고, 불변 클래스를 미리 만들어놓거나 혹은 새로 만든 인스턴스를 캐싱하여 재활용함으로써 불필요한 객체 생성을 피할 수 있습니다.
세번째로 반환 타입의 하위 타입을 반환할 수 있습니다.
(인터페이스를 정적 팩토리 메소드의 반환타입으로 지정할 수도 있음)
마지막으로 입력되는 파라미터에 따라 다른 객체를 반환할 수 있습니다.
[정적 팩토리 메소드 적용 예시(enum type에 적용)]
private final static Map<String, MemberType> typeMap = Arrays.stream(values())
.collect(Collectors.toMap(MemberType::toString, Function.identity()));
public static MemberType fromStringMemberType(String memberType){
return typeMap.getOrDefault(memberType, Anonymous);
}
[정적 팩토리 메소드 적용 예시(게시글 생성)]
private Board(String title, String content, Writer writer){
this.title = title;
this.content = content;
this.writer = writer;
}
public static Board of(String title, String content, Writer writer) {
return new Board(title, content, writer);
}
[정적 팩토리 메소드 적용 예시(회원 생성)]
private Member(AccountType accountType, long accountId, String nickname) {
this.accountId = accountId;
this.accountType = accountType;
this.nickname = nickname;
}
public static Member of(AccountType accountType, long accountId, String nickname){
return new Member(accountType, accountId, nickname);
}
from : 파라미터 하나를 받아 해당 인스턴스 타입을 반환하는 형변환 메소드
of : 여러 파라미터를 입력받아 적합한 타입의 인스턴스를 반환
~Of : from 과 of의 좀더 상세한 버전
instance or getInstance : 만약 파라미터를 받는다면 명시한 파라미터에 맞게 인스턴스를 반환하지만, 같은 인스턴스가 반환될 것을 보장하진 않는다.
create or newInstance : 매번 새로운 인스턴스를 생성해 반환함을 보장한다.