ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 정적 팩토리 메서드 구현 (Public Static Factory Method)
    Programming Best Practices 2020. 3. 14. 14:15

    [요약]

    사용자 요청에 따라 생성되는 객체를 다르게 구현하려면 어떻게 해야할까?

    소설책을 요청하면 Novel Instance가 생기고, 잡지를 요청하면 Magazine Instance가 생기는 연습이다.


    1. Enum functional interface를 통해 다양한 종류의 객체 생성을 컨트롤 하는 Enum을 만들자

    @Getter
    public enum BookType {
    
    	NOVEL(NOVEL::create),
        MAGAZINE(MAGAZINE::create)
        
        private final transient BookFactory bookFactory;
        
        BookType(BookFactory bookFactory) { this.bookFactory = bookFactory };
    }

     

    2. Book과 Novel, Magazine 객체를 만들자

    각 클래스에 create method가 있고, 이 안에서 builder를 부르자. builder내의 create가 바로 instance를 만드는 부분이다(new 키워드)

     

    3. 사용자 요청 Request 클래스를 만들고, 그 안에 book 필드 값을 통해서 여러 객체를 다이나믹하게 생성해보자.

    package me.youngseok.demo.model;
    
    public class Book {
    
        private String isbn;
        private int price;
    
        public Book(String isbn, int price) {
            this.isbn = isbn;
            this.price = price;
        }
    
        public static Book create(String isbn, int price) {
            return Book.builder()
                    .setIsbn(isbn)
                    .setPrice(price)
                    .create();
        }
    
        public static Builder builder() {
            return new Builder();
        }
    
        public static class Builder {
            protected String isbn;
            protected int price;
    
            public Book create() {
                return new Book(
                        this.isbn,
                        this.price);
            }
    
            public String getIsbn() {
                return isbn;
            }
    
            public Builder setIsbn(String isbn) {
                this.isbn = isbn;
                return this;
            }
    
            public int getPrice() {
                return price;
            }
    
            public Builder setPrice(int price) {
                this.price = price;
                return this;
            }
        }
    }
    

    [팁]

    구글에서 제공하는 구아바(Guava) 라이브러리를 통해서, 인스턴스 타입을 컴파일 타임에 체크 할 수 있다. 

    public static Magazine create(String isbn, int price) {
    	Book book = Magazine.builder()
                    .setIsbn(isbn)
                    .setPrice(price)
                    .create();
    	Preconditions.checkArgument(book instanceof Magazine);
        return (Magazine) book;
    }
Designed by Tistory.