-
자바 nextstep - 상속, 팩토리 메서드 패턴카테고리 없음 2023. 7. 25. 16:12
1. 상속
- extends로 중복코드 제거
- 추상클래스를 통한 서비스 집중화 (추상화) - 캡슐 단위의 공통 서비스,기능
- 코드 집중화란 하나의 프로세스 내에서 중복되는 코드를 한 곳에 모아서 함수나 클래스 형태로 사용하는 것
- 공통 분모, 뼈대를 모아둔 것이므로, 추상 클래스는 새로운 객체를 생성할 수 없음 (new불가)
** 추상화 구현 과정에서 자식은 추상 메서드를 오버라이드로 구현해야함
-> 이 과정에서 전부 오버라이딩 할 거 아니고, 필요한 부분만 오버라이딩 하고 싶다.
-> but 추상메서드는 부모에 구현된게 없어서 super로 불러올 수 없음
-> 부모 클래스에 추상메서드와 동일하지만, 부모의 구현이 있는 메서드 두개 만들어서 처리
1.2 추상메서드 활용 - 팩토리 메서드 패턴
- Exam 추상클래스를 사용하는 ExamConsole에서 Exam클래스 구현 내용을 NewlecExcam으로 고쳐야함
- 이때 ExamConsole 소스코드 자체를 고치는 것이아니라
- 객체를 만드는 방식을 자식에게 위임하는 방식
>팩토리 메서드 패턴은 객체 생성을 공장(Factory) 클래스로 캡슐화 처리하여 대신 생성하도록 하는 디자인 패턴이다.
> 즉 클리이언트에서 직접 new 연산자를 통해서 객체를 생성하는 것이 아니라, 제품 객체들을 도맡아 생성하는 공장 클래스를 만들고, 이를 상속하는 서브 공장 클래스의 메서드가 여러 객체 생성을 책임 지는 것이다.
> 객체 생성에 필요한 과정을 템플릿 처럼 미리 구성해놓고, 객체 생성에 관한 전처리나 후처리 통해 생성 과정을 다양하게 처리하여 객체를 유연하게 정할 수 있다.
* 팩토리 메서드 패턴은 객체 만드는 공장을 만드는 패턴
-> 어떤 클래스의 인스턴스 만들지는 미리 정의한 공장 서브 클래스에서 결정
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://refactoring.guru/ko/design-patterns/factory-method