justgo_developer

추상 팩토리 패턴(Abstract Factory Pattern)를 이용한 인터페이스 중복 메소드 제거 본문

IT/자바

추상 팩토리 패턴(Abstract Factory Pattern)를 이용한 인터페이스 중복 메소드 제거

다날92 2023. 10. 10. 18:25
728x90
반응형

추상 팩토리 패턴(Abstract Factory Pattern)를 이용한 인터페이스 중복 메소드 제거

목차

  1. 추상 팩토리 패턴(Abstract Factory Pattern) 정의
  2. 추상 팩토리 패턴을 이용한 설계
  3. 추상 팩토리 패턴을 이용한 예제

개요

원래 개발했던 연동 서비스에 새로운 업체가 추가되어야 한다.
interface는 똑같지만 일부 메소드는 거의 동일하고 일부 메소드는 다르게 구현하여야 할 것 같다.
그래서 추상 팩토리 패턴을 이용해 공통코드를 추상클래스로 뽑아내려고 한다.
그 개념에 대해서 알아 보려고 한다.


상세

1. 추상 팩토리 패턴(Abstract Factory Pattern) 정의

팩토리를 추상화해서 관련있는 객체의 집합을 생성할 수 있는 팩토리를 만들고 조건에 따라 팩토리를 생성해서 서로 관련된 객체를 생성하는 패턴

내가 이해한대로 쉽게 말하자면,
공통 메소드를 뽑아내 abstract 클래스에 뽑아낸다.
abstract 클래스는 인터페이스를 구현하고,
나머지 로직이 다른 메소드는 생성한 absract 클래스를 상속(extends)해 구현하여야 함.

2. 추상 팩토리 패턴을 이용한 설계

  1. 인터페이스는 이미 정의됨
  2. 인터페이스를 구현하는 클래스 여러개 (팩토리 패턴으로 구현됨)
  3. 추가된 클래스 중 일부 메소드 로직은 아예 동일, 일부 메소드 로직은 다름
  4. 동일한 메소드는 중복을 제거해야함 : 중복된 메소드들을 abstract 클래스로 뽑아냄
  5. abstract 클래스는 interface를 implements함
  6. 각 클래스들은 동일한 메소드 뽑아낸 abstract class를 extends(상속)하여 나머지 메소드들을 구현
factory -> interface -> abstract class -> concrete class

728x90

 

3. 추상 팩토리 패턴을 이용한 예제

1. interface 메소드 정의

public interface StockService {

    StockGroup getStockGroup();

    String findKoreanName();

    String findCommonType(); //공통으로 사용 될 메소드
}

2. 인터페이스 구현하는 추상클래스 생성 > 공통으로 사용되는 메소드 abstract class에 구현

@Service
abstract class StockAbstractFactory implements StockService{

    @Override
    public String findCommonType() {
        return "STOCK";
    }
}

3. 추상클래스 상속받는 클래스 생성 > 나머지 메소드 concrete class에 구현

@Service
public class AirbnbServiceImpl extends StockAbstractFactory {
    @Override
    public StockGroup getStockGroup() {
        return StockGroup.AIRBNB;
    }

    @Override
    public String findKoreanName() {
        return StockGroup.AIRBNB.getKoreanName();
    }
}

4. Test 코드

    @Test
    public void findCommonTypeTest() {
        String appleService = stockServiceFactory.getSerivce(APPLE).findCommonType();
        String airbnbService = stockServiceFactory.getSerivce(AIRBNB).findCommonType();
        String samsungService = stockServiceFactory.getSerivce(SAMSUNG).findCommonType();
        String naverService = stockServiceFactory.getSerivce(NAVER).findCommonType();

        Assertions.assertEquals(appleService, "STOCK");
        Assertions.assertEquals(airbnbService, "STOCK");
        Assertions.assertEquals(samsungService, "STOCK");
        Assertions.assertEquals(naverService, "STOCK");
    }

728x90
반응형