ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 nextstep - 상속, 팩토리 메서드 패턴
    카테고리 없음 2023. 7. 25. 16:12

    1. 상속

     

    - extends로 중복코드 제거

    - 추상클래스를 통한 서비스 집중화 (추상화) - 캡슐 단위의 공통 서비스,기능 

    - 코드 집중화란 하나의 프로세스 내에서 중복되는 코드를 한 곳에 모아서 함수나 클래스 형태로 사용하는 것 

    - 공통 분모, 뼈대를 모아둔 것이므로, 추상 클래스는 새로운 객체를 생성할 수 없음 (new불가) 

     

    ** 추상화 구현 과정에서 자식은 추상 메서드를 오버라이드로 구현해야함

        -> 이 과정에서 전부 오버라이딩 할 거 아니고, 필요한 부분만 오버라이딩 하고 싶다.

        -> but 추상메서드는 부모에 구현된게 없어서 super로 불러올 수 없음

        -> 부모 클래스에 추상메서드와 동일하지만, 부모의 구현이 있는 메서드 두개 만들어서 처리 

     

    1.2 추상메서드 활용 - 팩토리 메서드 패턴 

    - Exam 추상클래스를 사용하는 ExamConsole에서 Exam클래스 구현 내용을 NewlecExcam으로 고쳐야함

    - 이때 ExamConsole 소스코드 자체를 고치는 것이아니라

    - 객체를 만드는 방식을 자식에게 위임하는 방식 

     

    >팩토리 메서드 패턴은 객체 생성을 공장(Factory) 클래스로 캡슐화 처리하여  대신 생성하도록 하는 디자인 패턴이다.

    > 즉 클리이언트에서 직접 new 연산자를 통해서 객체를 생성하는 것이 아니라, 제품 객체들을 도맡아 생성하는 공장 클래스를 만들고, 이를 상속하는 서브 공장 클래스의 메서드가 여러 객체 생성을 책임 지는 것이다.

    > 객체 생성에 필요한 과정을 템플릿 처럼 미리 구성해놓고, 객체 생성에 관한 전처리나 후처리 통해 생성 과정을 다양하게 처리하여 객체를 유연하게 정할 수 있다.

     

    * 팩토리 메서드 패턴은 객체 만드는 공장을 만드는 패턴 

       -> 어떤 클래스의 인스턴스 만들지는 미리 정의한 공장 서브 클래스에서 결정

     

    출처:https://refactoring.guru/ko/design-patterns/factory-method

    1. Product : 제품 구현체 추상화

    2. ConcreteProduct: 제품 구현체 

    3. Creator: 최상위 공장 클래스, 팩토리 메서드를 추상화하여 서브 클래스가 구현하도록 한다.

                      객체 생성 처리 메서드(someOperation): 객체 생성에 관한 전,후처리 템플릿화

                       팩토리 메서드 (createProduct): 서브 공장 클래스에서 재정의할 객체 생성 추상화

     

    *패턴을 정리하자면, 

    Product를 생성하는게 목표이다. (특정 객체) 

    Product를 생성하기 위한 Factory가 있는 것이다. 

    1. Product 인터페이스를 구현해 두고 각 Product별로 전처리시 필요한 메서드를 정의해두자 

       (필요없어도 인터페이스와 구현체로 나누는 작업은 필요하다 <- 다형성 이용할 것)

    2. 최상위 팩토리 클래스를 만들자 

       - 서브 팩토리에 따라 다른 Product를 만들 수 있도록, Product생성 메서드를 추상화

       - 객체 생성 처리 메서드는 구현 해둔다. 

     3. 서브 팩토리 클래스를 만든다.

        - 추상화된 객체 생성 메서드를 오버라이딩하여, 특정 Product를 return하도록 만든다.

     

    > Product

    interface Product{
        void setting();
    }
    
    class ConcreateProduct1 implements Product{
    
        @Override
        public void setting() {
    
        }
    }
    
    class ConcreteProduct2 implements Product{
    
        @Override
        public void setting() {
    
        }
    }

    > Factory

    abstract class AbstractFactory {
        //객체 생성에 대한 전처리 후처리 메서드
        final Product createOperaion(){
            Product product = createProduct(); // 서브 클래스에 팩토리 메서드 호출
            product.setting(); // 객체 생성에 필요한 이런 저런 로직 (Product 구현체 별로 다름)
            return product; //return
        }
        abstract protected Product createProduct();
    }
    
    class ConcreateFactory1 extends AbstractFactory{ //Product1만을 생성하기 위한 서브팩토리)
    
        @Override
        protected Product createProduct() {
            return new ConcreateProduct1();
        }
    }
    
    class ConcreateFactory2 extends AbstractFactory{//Priduct2만을 생성하기 위한 서브 팩토리
    
        @Override
        protected Product createProduct() {
            return new ConcreteProduct2();
        }
    }
     public static void main(String[] args){
            AbstractFactory[] fac={
                new ConcreateFactory1(),
                new ConcreateFactory2()
            };
    
            Product p1 = fac[0].createOperaion();
            Product p2 = fac[1].createOperaion();
        }

    *AbstractFactory형 참조변수지만, createOperation작동시 실제 인스턴스인 각 ConcreateFactory로 동작한다는 것 (다형성) 잊지말자!

    * 참조변수는 메모리 셀에 참조값만 담고있고, 이를 통하여 접근 할 수 있는 메서드나 필드만 확인할 뿐 동작에 관여하는건 아니라는 사실!! 

     

     

    팩토리 메서드 패턴 사용시기 

    1. 클래스 생성과 사용 처리 로직을 분리하여 결합도 낮추고자 할 때 

    2. 코드가 동작해야하는 객체 유형과 종속성을 캡슐화 하여 정보를 은닉 처리할 경우

    3. 라이브러리 혹은 프레임워크 사용자에게 구성 요소 확장 방법을 제공하려 하는 경우

    4. 기존 객체를 재구성하지않고 기존 객체를 재사용하려할 때 (객체 생성 변화에 대비)

     

    장점:

    1. 생성자와 구현 객체의 강한 결합을 피한다.

    2. 팩토리 메서드를 통해 생성 후 공통으로 할 일을 수행하도록 지정가능 

    3. 캡슐화 추상화를 통해 생성되는 구체적인 타입을 감출 수 있다. 

     

    참고자료: 

    https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9CFactory-Method-%ED%8C%A8%ED%84%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90

     

    💠 팩토리 메서드(Factory Method) 패턴 - 완벽 마스터하기

    Factory Method Pattern 팩토리 메소드 패턴은 객체 생성을 공장(Factory) 클래스로 캡슐화 처리하여 대신 생성하게 하는 생성 디자인 패턴이다. 즉, 클라이언트에서 직접 new 연산자를 통해 제품 객체를

    inpa.tistory.com

    https://refactoring.guru/ko/design-patterns/factory-method

     

    팩토리 메서드 패턴

    / 디자인 패턴들 / 생성 패턴 팩토리 메서드 패턴 다음 이름으로도 불립니다: 가상 생성자, Factory Method 의도 팩토리 메서드는 부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공하지

    refactoring.guru

    https://edu.nextstep.camp/

     

    NEXTSTEP

     

    edu.nextstep.camp

     

Designed by Tistory.