udemy 강좌(Java Design Patterns & SOLID Design Principles)를 정리한 내용이다.
이 장에서 많은 사람들은 심플 팩토리를 디자인 패턴으로 생각하지 않고 왜 그런지 알게 될 것이다.
심플 팩토리가 해결하는 문제는 무엇인가?
시작하기 전에 심플 팩토리를 사용하는 간단한 코드를 한번 보자.
if (key.equalsIgnoreCase("pudding")) {
// create pudding object
} else if (key.equalsIgnoreCase("cake")) {
// create cake object
}
여기 간단한 if, else 블록이 있고 특정 값을 비교하는 로직이 있다. 값에 따라 특정 객체를 초기화하고 하고 있다. 그리고 이런 것들이 심플 팩토리가 사용되는 유형이다.
심플 팩토리는 무엇인가?
- 객체 초기화 로직을 단지 개별 클래스의 static 메소드로 옮긴다.
- 어떤 사람들은 심플 팩토리를 "디자인 패턴"으로 생각하지 않는다. 왜냐하면 객체 초기화를 캡슐화만 하는 역할을 하기 때문이다. 그런 메소드에는 전혀 복잡하지가 않다.
우리는 종종 심플 팩토리를 팩토리 메소드 패턴과 혼동한다. - 일반적으로 객체를 생성하고 간단한 로직이 특정 클래스를 선택하는데 하나 이상의 선택사항이 있다면 이 패턴을 사용하게 된다.
UML

심플 팩토리 구현
- 심플 팩토리에 대한 개별 클래스를 생성하면서 시작한다.
- 원하는 객체 인스턴스를 리턴하는 메소드를 추가한다.
- 이 메세드는 보통 static이 될 것이고 초기화할 클래스를 결정하는 인수를 몇개 받을 것이다.
- 객체를 초기화할 때 사용되는 몇 개의 인수를 더 받을 수도 있다.
- 원하는 객체 인스턴스를 리턴하는 메소드를 추가한다.
Java 구현
이제 Java로 심플 팩토리를 구현해보자.
@Getter
@Setter
public abstract class Post {
private Long id;
private String title;
private String content;
private LocalDateTime createdOn;
private LocalDateTime publishedOn;
}
여기에 Post 클래스가 있고 추상 클래스이다. 이 Post는 웹사이트에 게시되는 글을 나타낸다.
이 Post에는 여러 개의 서브클래스가 있다. NewsPost가 있고 웹사이트에 게시되는 클래스를 나타낸다. 비슷하게 게시되는 블로그의 글을 나타내는 BlogPost가 있다. 그리고 웹사이트에 상품정보를 나타내는 ProductPost가 있다.
public class PostFactory {
public static Post createPost(String type) {
switch (type) {
case "blog":
return new BlogPost();
case "news":
return new NewsPost();
case "product":
return new ProductPost();
default:
throw new IllegalArgumentException("Post type is not exists: " + type);
}
}
}
PostFactory는 심플 팩토리를 구현하는 클래스이다. 심플팩토리를 구현하기 위해서 우선 static 메소드를 만들 것이다. 파라미터는 type을 받고 세 개의 객체를 생성할 것이다.
다음은 Client를 만들어볼 차례이다. main 메소드에서 단지 심플 팩토리를 사용할 것이다.
public class Client {
public static void main(String[] args) {
Post blogPost = PostFactory.createPost("blog");
System.out.println(blogPost);
Post newsPost = PostFactory.createPost("news");
System.out.println(newsPost);
}
}
구현 고려사항
- 심플 팩토리는 기존 클래스에서 단지 하나의 메소드일 뿐이다. 하지만 심플 팩토리를 좀 더 쉽게 사용하기 위해 코드의 일정 부분에 개별 클래스를 추가하는 것이다.
- 심플 팩토리 그 자체는 어떤 상태도 필요하지 않아서 static 메소드로 만드는 것이 가장 좋다.
디자인 고려사항
- 심플 팩토리는 객체를 만들 때 빌더와 같은 다른 디자인 패턴을 사용할 수도 있다.
- 서브 클래스에서 심플 팩토리를 구현하는 경우에, 팩토리 디자인 패턴을 대신 사용해야 할 수도 있다.
위험요소
- 객체 생성 시 결정되는 심플 팩토리의 기준이 시간이 지남에 따라 더 복잡해질 수 있다. 그런 경우에는 팩토리 메소드 패턴을 사용하는 것이 좋다.
반응형