공부하는 블로그

Design Pattern | Factory Method 본문

Others

Design Pattern | Factory Method

치킨닮은닭 2020. 9. 14. 23:22

Factory Method?

팩토리 메서드(Factory Method)는 객체 생성을 위한 디자인 패턴 중 하나로, 쉽게 말하면 객체 생성을 대신 수행해주는 공장이라 할 수 있다. 팩토리 메서드 패턴을 이용하면 팩토리 클래스에서 간접적으로 객체를 생성 후 반환해준다. 

 

Factory Method 기본 예제코드(JAVA)

 이동 수단을 제작하는 공장을 만들어보자.

// Products

interface Transport {
   public void ride();
}

class Car implements Transport{
  @Override
  public void ride() {
    System.out.println("뛰뛰빵빵");
  }    
}

class Bicycle implements Transport{
  @Override
  public void ride() {
    System.out.println("따르릉따르릉");
  }
}

 

Transport라는 인터페이스를 통해 각기 다른 ride() 메소드를 가진 Car와 Bicycle 객체를 생성할 수 있다.

 

// Factory

public class Factory {
    public Transport createTransport(Usage u) {
        if(u == Usage.BICYCLE) {
            return new Bicycle();
        }else if (u == Usage.CAR) {
            return new Car();
        }
        return null;
    }
}

 

Factory 클래스는 createTransport() 메소드를 이용하여 각기 다른 Transport(Bicycle 또는 Car)를 생성할 수 있다.

 

// 객체를 생성해보자

public class CreateObj {
    private Factory factory = new Factory();

    Transport tp1;
    Transport tp2;

    void withoutFactory() {
        tp1 = new Bicycle();
        tp2 = new Car();

        tp1.ride();	// 따르릉따르릉
        tp2.ride();	// 뛰뛰빵빵
    }

    void withFactory() {
        tp1 = factory.createTransport(Usage.BICYCLE);
        tp2 = factory.createTransport(Usage.CAR);

        tp1.ride();	// 따르릉따르릉
        tp2.ride();	// 뛰뛰빵빵
    }
}

enum Usage {
    BICYCLE, CAR
}

 

 

withoutFactory()는 직접 인스턴스를 생성해주는 메서드이며 withFactory() 팩토리를 통해 간접적으로 인스턴스를 생성해주는 메서드이다. 

 

 위의 예제 코드를 살펴보면 왜 굳이 팩토리 메서드를 사용해야 하는지 의문이 들 것이다. 오히려 팩토리 클래스를 생성해야해서 더 번거로워 보일 수도 있다. 이에 대한 답은 아래에서 설명하도록 하겠다.

 

Factory Method 장점

 만약 셀 수없이 많은 클래스에서 각각 Transport를 직접 생성한다고 생각해보자. 이 때, 생성자의 매개변수를 변경하는 일이 발생한다면 수많은 클래스에 직접 생성된 Transport를 일일히 찾아가 하나하나 뜯어 고쳐야 할 것이다. 여기서 팩토리 메서드가 빛을 발하게 된다. 

 

 팩토리 메서드를 사용하여 객체를 생성했다면 하나하나 뜯어 고칠 필요 없이 Factory 클래스 내부의 create 메소드만 간단하게 수정하여 변경사항을 업데이트할 수 있게 된다.

 

 따라서, 팩토리 메서드는 객체 지향 원칙을 잘 지킬 수 있도록 도와준다.

 

1. 단일 책임 원칙 : Product 생성 코드를 프로그램의 한 위치(Factory)로 이동하여 코드를 더 쉽게 지원할 수 있다.

 2. 개방 / 폐쇄의 원칙 : 기존 클라이언트 코드를 손상시키지 않고 새로운 유형의 Product를 프로그램에 도입할 수 있다.

 

 이러한 팩토리 메서드는 추상 팩토리 메서드(Abstract Factory Method)로 확장되어 사용되기도 한다.

 

Factory Method 문제점

 패턴을 구현하기 위해 많은 하위 클래스를 도입해야 하므로 코드가 더 복잡해질 수 있다.


References

 

- 객체지향 디자인 패턴 : www.youtube.com/watch?v=q3_WXP9pPUQ&list=PLpO7kx5DnyIHrxFpyXKkzUg2F_mr-8yY0&index=3

- Factory Method : refactoring.guru/design-patterns/factory-method

- Java 디자인패턴 - 팩토리 메소드 패턴 : niceman.tistory.com/143

'Others' 카테고리의 다른 글

Others | Book Review : 읽기 좋은 코드가 좋은 코드다  (0) 2020.10.05
Design Pattern | Singleton  (0) 2020.09.14
Flowchart 작성법  (0) 2020.09.10
Comments