Free Lines Arrow
본문 바로가기
Design pattern/GoF(인강편)

[Design Pattern] Abstract Factory Pattern

by skahn1215 2021. 11. 29.
728x90
반응형

Abstract Factory Pattern

  • 추상팩토리 패턴은 연관된 객체들의 집합을 형성할때 이용하는 디자인 패턴이다.
  • 하나의 클래스를 만들고 객체를 만드는 방식에 따라 기능을 독립적으로 구현하기 위해 사용하는 패턴이다.
  • 구조보다 코드를 보면서 이해하는게 빠르다.

 

Abstract Factory Pattern 구조

추상팩토리의 구조이다.

  • 1. 아이템 A, B, C 의Interface 있다.
     - 실제 구현체는 Factory 를 통해 구현이 된다.
  • 2. Factory 역시 Interface 가 있다. 
     - 상황에 맞는 Factory 를 만들어 다른 객체를 만들어 낸다.

 

 

Abstract Factory Pattern 예제

  • 기본적으로 CarFactory 있다.
     - CarFactory 를 이용해 다른 자동차 공장을 만든다.
     - BMW, Benz 등

  • 필요한 부품은 Frame, Wheel, Engine 이 있다.
     - Frame, Wheel, Engine 을 상속받아 각 공장에 맞는 필요한 부품들을 구현한다.

 

Abstract Factory Pattern 구현

Interface 부분

CarFactory

public interface CarFactory {
    public Frame createFrame();
    public Wheel createWheel();
    public Engine createEngine();
}

 

Frame

public interface Frame {
     void info();
}

 

Wheel

public interface Wheel {
    void info();
}

 

Engine

public interface Engine {
    void info();
}

 

BMW 구현 부분

BMWFactory

public class BMWFactory implements CarFactory {
    @Override
    public Frame createFrame() {
        return new BMWFrame();
    }

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

    @Override
    public Engine createEngine() {
        return new BMWEngine();
    }
}

 

BMWFrame

public class BMWFrame implements Frame {
    @Override
    public void info() {
        System.out.println("BMW 바디");
    }
}

 

BMWWheel

public class BMWWheel implements Wheel {
    @Override
    public void info() {
        System.out.println("BMW 바퀴");
    }
}

 

BMWEngine

public class BMWEngine implements Engine {
    @Override
    public void info() {
        System.out.println("BMW 엔진");
    }
}

 

 

Main

public class Main {
    public static void main(String[] args) {
        // 간단한 변경으로 다른 종류의 car 를 만들수 있다.
        CarFactory benzCarFactory = new BenzFactory();
        CarFactory BMWCarFactory = new BMWFactory();

        Frame body = benzCarFactory.createFrame();
        Wheel wheel = benzCarFactory.createWheel();
        Engine engine = BMWCarFactory.createEngine();

        body.info();
        wheel.info();
        engine.info();
    }
}

 

결과

각각 개별적으로 아이템을 만들었다.

Benz 바디
Benz 바퀴
BMW 엔진

 

참고

Benz 는 내용만 다르기 때문에 생략한다.

 

코드 문제점

  • 결과를 보면 Benz 와 BMW 가 섞여 있다. 
  • 그렇게 되면 정상동작이 불가능 할것 이다.
  • 그래서 여기다가 팩토리 메서드 패턴을 적용해본다.

 

Factory Method Pattern 적용하기

CarFactoryMethod

  • CarFactoryMethod 클래스 를 만들었다.
  • getInstance 에서 각각 맞는 객체를 생성후 리턴해준다.
public class CarFactoryMethod {

    static public CarFactory getInstance(int type) {
        switch (type) {
            case 1:
                return new BenzFactory();
            case 2:
                return new BMWFactory();
            default:
                System.out.println("존재 하지 않는 타입입니다. BenzFactory 를 반환합니다.");
                return new BenzFactory();
        }
    }
}

 

Main

이제 getInstance 에 원하는 타입만 넣어주면된다.

public class Main {
    public static void main(String[] args) {
        // 간단한 변경으로 다른 종류의 car 를 만들수 있다.
        /*
        CarFactory benzCarFactory = new BenzFactory();
        CarFactory BMWCarFactory = new BMWFactory();
         */

        CarFactory carFactory =  CarFactoryMethod.getInstance(1);

        Frame body = carFactory.createFrame();
        Wheel wheel = carFactory.createWheel();
        Engine engine = carFactory.createEngine();

        body.info();
        wheel.info();
        engine.info();
    }
}

 

 

 

 

 

전체코드

https://github.com/rnrl1215/design-pattern/tree/main/src/main/java/patterns/abstractfacotry

 

GitHub - rnrl1215/design-pattern

Contribute to rnrl1215/design-pattern development by creating an account on GitHub.

github.com

 

728x90
반응형

'Design pattern > GoF(인강편)' 카테고리의 다른 글

[Design Pattern] Composite Pattern  (0) 2022.08.15
[Design Pattern] Bridge Pattern  (0) 2021.12.26
[Design Pattern] Builder Pattern  (0) 2021.11.24
[Design Pattern] Prototype Pattern  (0) 2021.11.24
[Design Pattern] Singleton Pattern  (0) 2021.11.24

댓글