본문 바로가기
  • 주니어 개발자의
    RESTful 성장기
Design Pattern

Abstract Factory Pattern

by 돌건 2022. 1. 17.

추상 팩토리 패턴

서로 관련 있는 여러 객체를 만들어주는 인터페이스를 제공한다.
구체적으로 어떤 클래스의 인스턴스를 사용하는 지 감출 수 있다.

 

다이어그램

[추상 팩토리 패턴 다이어그램]

출처: https://gmlwjd9405.github.io/images/design-pattern-abstract-factory/abstract-factory-pattern.png

 

팩토리 메서드 패턴과 추상 팩토리 패턴

  팩토리 메서드 패턴 추상 팩토리 패턴
공통점 구체적인 객체 생성 과정을 추상화한 인터페이스를 제공한다.
특징 - 팩토리를 구현하는 방법에 초점을 둔다.
- 구체적인 객체 생성 과정을 하위 또는 구체적인 클래스로 옮기는 것이 목적이다.
- 팩토리를 사용하는 방법에 초점을 둔다.
- 관련 있는 여러 객체를 구체적인 클래스에 의존하지 않고 만들 수 있게 해주는 것이 목적이다.

 

예제

1. AbstractFactory

public interface SmartPhonePartsFactory {

    Camera createCamera();

    Display createDisplay();
}
- AbstractFactory를 interface로 생성함으로써, 구현을 통해 객체(ConcreteProduct)를 생성한다.

 

2. AbstractProduct

public interface Camera {
    /* empty */
}

public interface Display {
    /* empty */
}
- Product는 이 AbstractProduct를 상속받으며, ConcreteFactory에서 해당 Product를 생성하게 된다.

 

3. ConcreteFactory

public class SamsungPartsFactory implements SmartPhonePartsFactory {

    @Override
    public Camera createCamera () {
        return new SamsungCamera();
    }

    @Override
    public Display createDisplay () {
        return new SamsungDisplay();
    }
}
- AbstractFactory를 구현한 ConcreteFactory이다.
- AbstractProduct인 Camera와 Display를 상속받은 SamaungCamera와 SamsungDisplay를 생성한다.

 

4. ConcreteProduct

public class SamsungCamera implements Camera {
    /* empty */
}

public class SamsungDisplay implements Display {
    /* empty */
}
- AbstractProduct를 상속받은 ConcreteProduct이다.

 

5. Client

public class SamsungSmartPhoneFactory implements SmartPhoneFactory {

    private SmartPhonePartsFactory smartPhonePartsFactory;

    public SamsungSmartPhoneFactory (SmartPhonePartsFactory smartPhonePartsFactory) {
        this.smartPhonePartsFactory = smartPhonePartsFactory;
    }

    @Override
    public SmartPhone createSmartPhone (String color) {

        SmartPhone smartPhone = new SamsungSmartPhone( color );

        smartPhone.setCamera( smartPhonePartsFactory.createCamera() );
        smartPhone.setDisplay( smartPhonePartsFactory.createDisplay() );

        return smartPhone;
    }
}
- SamsungSmartPhoneFactory는 AbstractFactory를 필드로 가지며, 생성될 때 의존 관계를 주입받게 된다. 
- createSmartPhone()에서 삼성 스마트폰이 생성되는 과정 중에 Camera와 Display가 AbstractFactory에 의해 생성된다. (실제로는 ConcreteFactory가 생성하게 될 것.)

# 삼성 스마트폰 생성자 코드는 [팩토리 메서드 패턴] 게시글에서 확인할 수 있다. 이 게시글의 코드들은 해당 게시글에 기재된 코드들을 확장한 것이다.

 

6. Test

public class Test {

    public static void main (String[] args) {

        SmartPhoneFactory smartPhoneFactory = new SamsungSmartPhoneFactory( new SamsungPartsFactory() );

        SmartPhone smartPhone = smartPhoneFactory.orderSmartPhone( "다라이레드" );

        System.out.println( "smartPhone = " + smartPhone );
    }
}

[실행 결과]

 

 

참고 사이트: https://sun-22.tistory.com/10
참고 강의: 백기선 - 코딩으로 학습하는 GoF의 디자인 패턴 (인프런)

'Design Pattern' 카테고리의 다른 글

Factory Method Pattern  (0) 2022.01.15
Singleton Pattern  (0) 2022.01.13

댓글