도서 요약 / / 2023. 2. 9. 20:12

디자인 패턴 - 심플 팩토리(simple factory) 패턴

udemy 강좌(Java Design Patterns & SOLID Design Principles)를 정리한 내용이다.

https://www.udemy.com/course/design-patterns-in-java-concepts-hands-on-projects/learn/lecture/9604610?start=0#overview


이 장에서 많은 사람들은 심플 팩토리를 디자인 패턴으로 생각하지 않고 왜 그런지 알게 될 것이다.

심플 팩토리가 해결하는 문제는 무엇인가?

시작하기 전에 심플 팩토리를 사용하는 간단한 코드를 한번 보자.

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 메소드로 만드는 것이 가장 좋다.

디자인 고려사항

  • 심플 팩토리는 객체를 만들 때 빌더와 같은 다른 디자인 패턴을 사용할 수도 있다.
  • 서브 클래스에서 심플 팩토리를 구현하는 경우에, 팩토리 디자인 패턴을 대신 사용해야 할 수도 있다.

위험요소

  • 객체 생성 시 결정되는 심플 팩토리의 기준이 시간이 지남에 따라 더 복잡해질 수 있다. 그런 경우에는 팩토리 메소드 패턴을 사용하는 것이 좋다.



반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유