본문

Factory Method Pattern

반응형

객체를 생성하기 위한 인터페이스를 정의하고, 인스턴스 생성은 서브클래스가 결정하게 한다.

 

 

이미지 출처: https://refactoring.guru/design-patterns/factory-method

 

 

규모가 크거나 규모가 커질 가능성이 있는 작업을 할 때 사용한다.

 

 

factory는 공장이죠. 객체를 막 찍어내는 놈입니다. 객체 선언은 보통 new 객체() 이런식으로 하죠. factory는 내부에서 그런 일을 해줍니다.

즉, factory를 가져다가 쓰는 부분에서는 new 객체()와 같은 식으로 변수를 선언할 필요가 없습니다.

Abstract class나 인터페이스에 대해서 다양한 하위 구현체가 있을 경우에 사용하면 좋습니다. 

 

 

 

💡 동물.java

public interface 동물 {
    public void 해당동물을설명한다();
}

 

public class 동물공장 {
    // 여기서 '동물'은 인터페이스. 즉, 객체타입은 '동물'
    public static 동물 create(String 동물이름) {
        if (동물이름 == null) {
            throw new IllegalArgumentException("null안됨 ㅃㅃ");
        }
        if (동물이름.equals("소")) {
            return new 소();
        } else if (동물이름.equals("고양이")) {
            return new 고양이();
        } else if (동물이름.equals("개")) {
            return new 개();
        } else {
            return null;
        }
    }
}

public class 고양이 implements 동물 {
    public void 해당동물을설명한다(){
        System.out.println("쥐잡기 선수");
    }
}

public class 소 implements 동물 {  
    public void 해당동물을설명한다() {
        System.out.println("우유 및 고기 제공");
    }
}

public class 개 implements 동물 {
    public void 해당동물을설명한다() {
        System.out.println("주로 집 지킴");
    }
}

 

💡 Main.java

public class Main {
    public static void main(String[] args) {
        동물 동물01 = 동물공장.create("소");
        동물01.해당동물을설명한다();

        동물 동물02 = 동물공장.create("고양이");
        동물02.해당동물을설명한다();

        동물 동물03 = 동물공장.create("개");
        동물03.해당동물을설명한다();
    }
}

 

💡 결과

우유 및 고기 제공
쥐잡기 선수
주로 집 지킴

 

일단 '동물'이라는 인터페이스가 있습니다. Cat, Cow, Dog 는 이 인터페이스의 구현체들입니다. 그리고 '동물공장'이 있는데, 여기서 '동물'의 구현체를 돌려줍니다. Main에서 new 소()와 같이 하지 않고, 동물농장.create("소")를 호출하는 게 일반적인 방법과의 차이입니다.

 

'동물'의 구현체가 더 늘어나면 어떻게 될까요? 전부 new 다른동물()과 같이 생성하는 것보다는 Facotry의 create()메소드만 수정하는 게 좀 편하겠죠? 

 

반응형

공유

댓글