ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [디자인 패턴] Factory Method 패턴
    Programming Language/java 2023. 8. 20. 20:07

    1. Factory Method 패턴이 무엇인지 정리하고

    2. 어느 상황에 유용한지 생각해보자

     

    인스턴스 생성을 Factory에게 맡기는 것이 팩토리 메서드 패턴인데 예시와 함께 살펴보자

     

    // Product: 문서의 공통 인터페이스
    interface Document {
        void write(String content);
    }
    
    // ConcreteProduct: 텍스트 문서 클래스
    class TextDocument implements Document {
        @Override
        public void write(String content) {
            System.out.println("Writing text: " + content);
        }
    }
    
    // ConcreteProduct: PDF 문서 클래스
    class PdfDocument implements Document {
        @Override
        public void write(String content) {
            System.out.println("Generating PDF: " + content);
        }
    }
    
    // DocumentFactory: 문서 생성을 위한 추상 메서드를 가진 클래스
    abstract class DocumentFactory {
        abstract Document createDocument();
    }
    
    // ConcreteCreator: 텍스트 문서 생성자 클래스
    class TextDocumentFactory extends DocumentFactory {
        @Override
        Document createDocument() {
            return new TextDocument();
        }
    }
    
    // ConcreteFactory: PDF 문서 생성자 클래스
    class PdfDocumentFactory extends DocumentFactory {
        @Override
        Document createDocument() {
            return new PdfDocument();
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            DocumentFactory textFactory = new TextDocumentFactory();
            Document textDocument = textFactory.createDocument();
            textDocument.write("Hello, this is a text document.");
    
            DocumentFactory pdfFactory = new PdfDocumentFactory();
            Document pdfDocument = pdfCreator.createDocument();
            pdfDocument.write("Hello, this is a PDF document.");
        }
    }

     

    위의 예시와 같이 공통의 Factory 추상 클래스를 선언하고 각 Factory의 구현체들이 인스턴스 생성을 구체화하는 방식이다.

    DocumentFactory 타입으로 생성하여 createDocument() 메서드로 일관되게 생성할 수 있다.

     

    그렇다면 왜 인스턴스 생성을 굳이 팩토리 클래스를 만들면서까지 복잡하게 할까?

    => 위의 사용 예시보다 T (제네릭) 을 사용하면 유지보수 측면과 코드량을 줄일 수 있다.

     

    public class TextDocumentFactory implements DocumentFactory<TextDocument> {
        @Override
        public TextDocument createDocument(InputStream input) throws IOException {
            return new TextDocument(input);
        }
    }
    
    
    public class Main {
    
        DocumentFactory<T> documentFactor = new TextDocumentFactory();
    
        public static void main(String[] args) {
    
            // 각 타입의 Factory는 인터페이스를 implements 하여 구현되어 있는 상황.
            // input에 따라 TextDocument, PdfDocument ... 등의 타입이 정해진다.
            T document = documentFactory.createDocument(input);
    
            document.write("~~");
        }
    }

     

    제네릭 + 팩토리 메서드 패턴이 없다면 Document 인스턴스를 생성할 때마다 input에 따라 case문으로 분기하여 인스턴스를 생성했을텐데, 위와 같이 사용하면 다형성을 이용해서 분기 없이 깔끔하게 작성 가능하다.

     

    위에서는 new TextDocumentFactory() 로 생성했지만 스프링이라면 미리 Bean을 생성해서 전달 받거나 하는 형태로 활용 가능하다.

    결론은 제네릭을 사용해서 공통의 흐름을 만들어 놓고 세부 구현만 타입마다 따로 해주면 유지보수 (확장, 삭제 등) 하기 편해진다.

     

    static Factory Method

    파라미터의 개수나 타입에 따라 getInstance, of, asList, valueOf, now 와 같은 static 메서드로 인스턴스를 생성하는 방법.

    개발자에게 혼란을 줄여주면서 일관되게 사용하도록 해준다.

     

    'Programming Language > java' 카테고리의 다른 글

    Netty 정리  (0) 2024.04.23
    [디자인 패턴] 싱글톤 패턴  (0) 2023.09.01
    [디자인 패턴] Template Method 패턴  (0) 2023.08.20
    [디자인 패턴] Adapter 패턴  (0) 2023.08.19
    [디자인 패턴] Iterator 패턴  (0) 2023.08.19
Designed by Tistory.