본문 바로가기
Theory/Design Pattern

ABSTRACT FACTORY PATTERN

by y.j 2022. 3. 27.
728x90

ABSTRACT FACTORY PATTERN

의존적이고 연관되어 있는 구조에서 구체적으로 명시되어있는 클래스보다는 인터페이스를 제공하는 것이다.

필수적으로 필요한 객체를 어떻게 독립적으로 생성할까?
연관되고 의존적이지만 객체들의 서로 다른 Family는 어떻게 생성할까?

ProductA라는 interface를 상속받아 ProductA1이라는 class를 만들었다.

만약에 client에서 new ProductA1()를 할 경우 어떤 문제가 있을까?

interface ProductA가 인스턴스화 되기 전에 ProductA1이 먼저 인스턴스화 된다면

컴파일이나 런타임 중 에러가 날 가능성이 있으므로

직접적으로 ProductA1를 인스턴스하는 것은 회피하는 것이 좋다.

 

Solution

Factory Pattern 구조

결합도를 낮추기 위해 Client클래스는 Factory와 Product들을 직접 인스턴스화 하는 대신에 interface들을 필드에 정의한다.

public class Client {
    private ProductA productA;                  // interface
    private ProductB productB;                  // interface
    private AbstractFactory factory;            // interface

    public Client(AbstractFactory factory) {
        this.factory = factory;
    }

    public String operation() {
        System.out.println("AbstractFactoryPattern.Client : Delegating creating objects to a factory object.");
        productA = factory.createProductA();
        productB = factory.createProductB();
        return "Hello " + productA.getName() +  " and " + productB.getName() + "!";
    }
}

 

Advantage

  1. 인터페이스를 참조하기 때문에 컴파일 타임에 의존성으로 인한 에러를 없앨 수 있다.

 

  1. 연관된 객체의 family를 여러개 생성 할 때, 연관된 객체의 Family를 동시에 생성하여 사용 할 수 있도록 보증한다.

       ex) single ton pattern + 내부클래스로 구현가능하다. ( 아래쪽 코드 참조 )

 

  1. Family를 다른 Family로 바꾸기 쉽니다.

         ex) Client client = new Client(new Factory1) // new Client(new Factory2)  (팩토리 객체만 바꿔주면 되기 때문에 간편하다.)

 

Disadvantage

  1. Factory를 확장하고 싶으면 abstract factory를 먼저 확장시켜야 한다.
  2. 대리자(delegate instantiation)가 추가적으로 필요로 한다.

 

[전체코드]

https://github.com/jKyounju/adapterPatterns/tree/master/src/abstractFactoryPattern

728x90

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

Factory Method Pattern  (0) 2022.04.10
Builder Pattern  (0) 2022.03.29
ADAPTER PATTERN  (0) 2021.07.22
SINGLETON PATTERN  (0) 2021.07.20
Introduction  (0) 2019.06.08

댓글