자바 디자인패턴 - 추상 팩토리 패턴

유사개발자·2022년 8월 9일
0

Design Patten

목록 보기
3/3
post-thumbnail

추상 팩토리 패턴

팩토리 메소드 패턴과 굉장히 흡사함

  • 둘 다 구체적인 객체 생성 과정을 추상화한 인터페이스를 제공함
  • 팩토리 메소드 패턴은 "팩토리를 구현하는 방법"에 초점을 둔다.
  • 추상 팩토리 패턴은 "팩토리를 사용하는 방법"에 초점을 둔다.

목적이 조금 다르다

  • 팩토리 메소드 패턴은 구체적인 객체 생성 과정을 하위 또는 구체적인 클래스로 옮기는 것이 목적
  • 추상 팩토리 패턴은 관련있는 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해주는 것이 목적.

추상 팩토리 패턴 구조

아래와 같은 Car Factory가 있다. createCar안에 Handle과 Wheel를 직접 new하여 넣어주고 있다.
지금 당장은 문제가 없지만 추후에 handle을 다른나라 제품을 사용하거나 해서 규격이 달라진다면 그때마다 코드를 수정해줘야 할 것이다. 즉 구현체를 직접 넣어주고 있기에 문제가 된다.

//클라이언트 코드
public class WhiteCarFactory implements DefaultCarFactory {

    @Override
    public Car createCar() {
        Car car = new Car();
        car.setHandle(new UsaWhiteHandle());
        car.setWheel(new UsaWhiteWheel());
        return car;
    }
}

추상 팩토리를 사용하여 문제를 해결해보자

1. 변경코드 추상화 하기

현재 handle과 wheel을 다른 회사의 제품이나 규격이 달라질 경우 문제가 되니 해당 부분을 추상화하여 변경에 대응할 수 있도록 한다.

public interface Handle {
}
public interface Wheel {
}

2. 추상화된 제품 구체화하기

이제 handle과 wheel을 추상화 했으니 실제 어떤 handle과 wheel을 사용할지 구체화 해줘야한다.
애국자인 본인은 국산품으로 만들기로 했다.

public class KoreaWhiteHandle implements Handle {
}
public class KoreaWhiteWheel implements Wheel {
}

3. 추상 팩토리 만들기

위에 클라이언트 코드에서 handle을 만들때 국산품을 사용하고 싶다면
new UsaWhiteHandle()부분을 new KoreaWhiteHandle()으로 직접 변경해줘야 하는 문제가 있기 때문에
해당 부분을 추상해준다.

public interface CarPartsFactory {
    Handle createHandle();
    Wheel createWheel();
}

4. 추상 팩토리 구체화하기

이제 handle과 wheel를 추상화 했으니 구체화 클래스를 만들어 해당 구현체에
필요한 객체들을 생성하게끔 해준다.

public class KoreaWhiteCarPartsFactory implements CarPartsFactory {
    @Override
    public Handle createHandle() {
        return new KoreaWhiteHandle();
    }

    @Override
    public Wheel createWheel() {
        return new KoreaWhiteWheel();
    }
}

기존코드 클라이언트 코드와 비교

CarPartsFactory는 차량의 부품을 생성하는 기능을 추상화 시킨 인터페이스이다.
이로써 WhiteCarFactory는 추상화된 부분을 의존하게 되어 Car객체를 만들때
부품의 규격이 바뀌더라도 클라이언트 코드는 바뀌지 않게 되었다.

public class WhiteCarFactory implements DefaultCarFactory {

    private CarPartsFactory carPartsFactory;

    public WhiteCarFactory(CarPartsFactory carPartsFactory) {
        this.carPartsFactory = carPartsFactory;
    }

    @Override
    public Car createCar() {
        Car car = new Car();
        car.setHandle(carPartsFactory.createHandle());
        car.setWheel(carPartsFactory.createWheel());
        return car;
    }
}

사용예시

WhiteCarFactory라는 클래스는 부품이 넘어와야 차를 만들 수 있다. 그러므로 나는
KoreaWhiteCarPartsFactory라는 한국산 부품을 생성하는 구현체를 넘겨줬다

public class main {
    public static void main(String[] args) {
        DefaultCarFactory car = new WhiteCarFactory(new KoreaWhiteCarPartsFactory());
        car.createCar();
    }
}

??? : "유사개발자님.. 이번에.. 한국산 부품이.. 수급이 안되서.. 잠시동안만.. 일본산 부품으로 만들어야해요.."

그래도 걱정하지 않아도 된다.. 이미 모든 기능들을 추상화 해놨기 때문에 구체화 클래스만 하나 만들어서 갈아끼워주면 된다.
KoreaWhiteCarPartsFactory가 아닌
JapenWhiteCarPartsFactory를 만들어 WhiteCarFactory클래스에 갈아끼워주면
퇴근을 빨리 할 수 있게된다 ㅎ

느낀점

예전에 강의에서 이와 비슷한 코드를 본 적이 있는데
추상 메소드 패턴임을 디자인 패턴을 공부하면서 알게 되었다.. 유지보수성을 좋게 코드를 짜면
짜는동안은 머리 아프겠지만 추후에 유연한대처와 퇴근을 일찍 할 수 있는 장점이 있으니 마니마니 공부해두자

profile
개발자와 유사한 개발자입니다

1개의 댓글