Design Pattern, Abstract Factory

2022. 1. 5. 18:20ETC/Design Patterns

반응형

 

Creational Object Pattern

Abstract Factory Pattern

 

-----------------    INDEX     -----------------

 

Abstract Factory Pattern ?

Abstraciton

pros and cons

Structure

Sample Code: Java

관련 패턴

 

----------------------------------------------

 

 

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

- GoF Design Patterns

 

추상 팩토리 패턴은 추상화된 클래스에 의존하여 서로 연관되거나 의존적인 객체들의 조합families을 만드는 인터페이스를 제공하는 패턴입니다. 다양한 구성 요소 별로 '객체의 집합'을 생성해야 할 때 유용한 패턴입니다.

 

추상 팩토리는 기본 'Factory'의 개념과 Factory Method의 이해가 필요합니다.

선수지식을 제대로 파악했는지 확인해보시고 Abstract Factory를 이해하는 것을 추천드립니다.

 

 

✔️ Factory

팩토리 vs 팩토리 메서드 패턴 & 추상 팩토리 패턴 : 추상화의 차이. 팩토리 메서드와 추상팩토리는 팩토리 패턴을 추상화함으로써 클래스의 선언과 구현을 분리

팩토리 메서드 패턴 vs 추상 팩토리 패턴 : 추상화된 그룹을 형성하고 관리

 

 

 

Abstraciton

일반적인 상속은 상위 클래스의 내용을 포함하는 객체를 확장시켜 하위 클래스를 생성한다는 개념입니다.

추상 클래스의 상속은 하위 클래스 내부에 상위 클래스에서 정의한 형식을 구체적 행위로 규정하는 선언입니다.

 

즉, 추상화는 인터페이스의 특징을 이용해 실제적 객체의 생성 동작은 하위 클래스로 위임하고, 하위 클래스는 상위 추상 클래스에서 선언된 인터페이스에 따라 메서드를 구현합니다.

 

 

✔️ 그룹화

추상 팩터리는 여러 개의 팩토리 메서드를 그룹으로 묶은 것과 유사하며, 팩토리 메서드 패턴을 병합하여 하나의 가상화된 객체 생성군을 형성할 수 있습니다. 팩토리 매서드에 비해 조금 더 크고 복잡한 객체군을 만들 수 있겠죠. 추상 팩토리는 가상화 그룹을 2개 이상 처리하고, 사용하는 목적은 복수의 객체 생성을 담당하는 군집을 관리합니다.

 

 

✔️ 제품 추가

추상클래스의 경우 그룹을 나누는 것은 쉽지만 서브 생성 객체를 추가하는 것이 어렵다는 단점이 있습니다. 제품의 생성이 추상 팩토리를 통한 제품 집합에 고정되어 있기 때문에 새롭게 생성되는 제품을 추가하기 어렵습니다. 만약 새로운 그룹을 추가하고자 하면 추상 팩토리와 모든 서브 클래스들을 수정해야합니다. 

 

 

Pros and Cons

✔️  장점

- 추상화를 통해 클래스의 선언과 구현을 분리

 

- 큰 변화없이 시스템의 군을 생성하고 변경할 수 있음

추상 팩토리의 그룹은 동일한 처리 로직을 갖고 있고, 다른 그룹으로 변경돼도 하위 클래스를 통해 선택적 객체를 다르게 생성할 수 있습니다. 코드를 일관적으로 유지하면서, 실제 구현을 다르게 실행시킬 수 있습니다.

 

- 프로젝트의 규모

프로젝트의 규모가 커질수록 클래스 파일과 관리할 객체 수가 많아지는데, 규모에 따라 하나의 생성 패턴으로 모든 객체를 생성 처리하는 것이 힘들 수 있습니다. 이 때, 필요한 객체 생성을 한 곳으로 모은 후 관리할 수 있습니다. 



✔️  단점

- 새로운 종류의 군을 추가하는 것이 쉽지 않음

새로운 군을 추가하여 확장할 때 모든 서브 클래스들이 동시에 변경돼야 합니다. 새로운 클래스 제품군이 추가되면 클래스 제품에 대한 구조를 설계하고, 이를 다시 추상 팩토리의 구조에 등록해야 함. 매번 새로운 종류를 추가할 때마다 구조를 재설계하는 것은 확장성 부분에서 좋지 않습니다. 또한, 계층의 크기가 커질수록 복잡한 문제가 발생할 수 있습니다.



 

Structure

 

GoF Design Patterns

 

AbstractFactory
팩토리 추상화 클래스 - 제품 군(ProductA, ProductB ...) 생성 메서드 형식을 지정하기 위한 인터페이스를 선언합니다.


ConcreteFactory
팩토리 구체화 클래스 - AbstractFactory를 구현하여 실제 제품 개체를 만듭니다.


AbstractProduct

제품 추상화 클래스 - 제품 개체 유형에 대한 인터페이스를 선언합니다.


ConcreteProduct
제품 구체화 클래스 - AbstractProduct를 구현하여 ConcreteFactory에서 생성할 제품 개체를 정의합니다.

Client
AbstractFactory 및 AbstractProduct 클래스에서 선언된 인터페이스만 사용합니다.

 

 

 

 

Sample Code: Java

AbstractFactory

public abstract class Factory {
    public abstract TireProduct createTire();
    public abstract DoorProduct createDoor();
}


ConcreteFactory

public class KoreaFactory extends Factory {
    public KoreaFactory() {
        System.out.println("KoreaFactory 객체를 생성합니다.");
    }

    public TireProduct createTire() {
        return new KoreaTireProduct();
    }

    public DoorProduct createDoor() {
        return new KoreaDoorProduct();
    }
}
public class StateFactory extends Factory {
    public StateFactory() {
        System.out.println("StateFactory 객체를 생성합니다.");
    }

    public TireProduct createTire() {
        return new StateTireProduct();
    }

    public DoorProduct createDoor() {
        return new StateDoorProduct();
    }
}

 


AbstractProduct

Product - Door

public abstract class DoorProduct {
    public abstract void makeAssemble();
}

 

Product - Tire

public abstract class TireProduct {
    public abstract void makeAssemble();
}

 

 

ConcreteProduct

Product - Door

public class KoreaDoorProduct extends DoorProduct {
    public KoreaDoorProduct() {
        System.out.println("KoreaTireProduct 객체를 생성합니다.");
    }

    public void makeAssemble() {
        System.out.println("한국 도어 장착");
    }
}
public class StateDoorProduct extends DoorProduct {
    public StateDoorProduct() {
        System.out.println("StateDoorProduct 객체를 생성합니다.");
    }

    public void makeAssemble() {
        System.out.println("미국 도어 장착");
    }
}

 

Product - Tire

public class KoreaTireProduct extends TireProduct {
    public KoreaTireProduct() {
        System.out.println("KoreaTireProduct 객체를 생성합니다.");
    }

    public void makeAssemble() {
        System.out.println("한국 타이어 장착");
    }
}
public class StateTireProduct extends TireProduct {
    public StateTireProduct() {
        System.out.println("StateTireProduct 객체를 생성합니다.");
    }

    public void makeAssemble() {
        System.out.println("미국 타이어 장착");
    }

}



Client

public class Main {
    public static void main(String[] args) {
        Factory korea = new KoreaFactory();

        TireProduct tire = korea.createTire();
        tire.makeAssemble();

        DoorProduct door = korea.createDoor();
        door.makeAssemble();


        Factory state = new StateFactory();

        tire = state.createTire();
        tire.makeAssemble();

        door = state.createDoor();
        door.makeAssemble();
    }
}

 

 

 

관련 패턴

C- Creational Patterns  |  S - Structural Patterns  |  B - Behavioral Patterns

 

 

C: Builder

추상 팩토리는 인터페이스를 이용하여 객체를 조립하지만,

빌더는 더 크고 복잡한 객체를 조립하거나 생성할 때 사용됩니다.

 

 

C: Factory Method

추상 팩토리는 팩토리 메서드를 확장합니다.

생성 패턴을 그룹화하여 단위별로 객체 생성하며 객체를 조립하는 과정에서 팩토리 메서드 패턴이 응용됩니다.

 

 

C: Singleton

유일한 객체 생성이 필요하다면 일부 객체는 싱글턴 방식으로 변경할 수 있습니다.

싱글턴 패턴을 이용하면 중복을 배제하고 객체를 생성할 수 있습니다.

 

 

S: Composite 

추상 팩토리는 추상화를 통해 객체 생성을 조합하는데, 조합된 객체는 복합 객체의 특징을 가집니다.

 

 

 

 

 

 

 

그럼 지금까지 Abstract Factory Pattern에 대해 알아보았습니다.

오타나 잘못된 내용이 있다면 댓글로 남겨주세요!

감사합니다 ☺️ 

 

 

 

 

모든 Design Patterns 모아보기

 

Design Patterns

안녕하세요. GoF 디자인 패턴을 정리하고자 합니다. 디자인 패턴은 일주일 전부터 공부를 시작했는데, 스스로 설명하듯 적는게 익히는데 도움이 클 것같아 정말 오랜만에 시리즈로 포스팅하려

gngsn.tistory.com

 

 

반응형

'ETC > Design Patterns' 카테고리의 다른 글

Design Pattern, Observer  (0) 2022.01.21
Design Pattern, Proxy  (0) 2022.01.12
Design Pattern, Factory Method  (0) 2022.01.03
Design Pattern, Template Method  (0) 2022.01.01
Design Pattern, Strategy  (0) 2021.12.29