Home 생성 패턴 - 팩토리 메서드 패턴
Post
Cancel

생성 패턴 - 팩토리 메서드 패턴

Factory Method Pattern

디자인 패턴이란?

디자인 패턴이란?

  • 디자인 패턴은 소프트웨어 공학의 소프트웨어 설계에서 공통으로 발생하는 문제를 자주 쓰이는 설계 방법을 정리한 패턴이다.
  • 디자인 패턴을 참고하여 개발하면 효율성과 유지보수성, 운용성이 높아지며, 프로그램 최적화가 된다고 한다.  

디자인 패턴을 목적과 범위로 나눌수 있다

구분유형설명
 생성객체 인스턴스 생성에 관여, 클래스 정의와 객체 생성 방식을 구조화, 캡슐화를 수행
목적구조더 큰 구조 형성 목적으로 클래스나 객체의 조합을 다루는 패턴
 행위클래스나 객체들이 상호작용하는 방법과 역할 분담을 다루는 패턴
범위클래스클래스간 관련성(상속), 컴파일 시 정적으로 결정
 객체객체 간 관련성을 다루는 패턴, 런타임 시 동적으로 결정

  

생성할 객체의 클래스를 국한하지 않고 생성한다.

추상 팩토리와의 차이: 팩토리 패턴은 한 종류의 객체를 생성하기 위해 사용되지만,
추상 팩토리 패턴은 연관되거나 의존적인 객체로 이루어진 여러 종류의 객체를 생성하기 위해 사용된다.

팩토리 메서드 패턴이란?

상위클래스에서는 인스턴스를 만드는 방법을 결정하고,
하위 클래스에서는 데이터의 생성을 책임지고 조작하는 함수들을 오버라이딩하여 인터페이스와 실제 객체를 생성하는 클래스를 분리할 수 있는 특징을 갖는 디자인 패턴.

img

팩토리 메소드 패턴 헤드 퍼스트

Product

1
2
3
4
5
interface Pizza {
    public void prepare();
    public void bake();
    public void box();
}

Creator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
abstract class PizzaStore {
    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type);    // factory method 사용
        pizza.prepare();
        pizza.bake();
        pizza.box();
        return pizza;
    }

    abstract Pizza createPizza(String type);    // factory method extends하면 필수구현
}
/*뉴욕 피자*/
class NYPizzaStore extends PizzaStore { 
    @Override
    Pizza createPizza(String type) {
        if ("cheese".equals(type)) {
            return new NYStyleCheesePizza();
        } else if ("pepperoni".equals(type)) {
            return new NYStylePepperoniPizza();
        }
        return null;
    }
}
/*시카고 피자*/
class ChicagoPizzaStore extends PizzaStore { 
    @Override
    Pizza createPizza(String type) {
        if ("cheese".equals(type)) {
            return new ChicagoStyleCheesePizza();
        } else if ("pepperoni".equals(type)) {
            return new ChicagoStylePepperoniPizza();
        }
        return null;
    }
}

Main

1
2
3
4
5
6
7
psvm(){
    PizzaStore nyStore = new NYPizzaStore();
    PizzaStore chicagoStore = new ChicagoPizzaStore();

    Pizza pizza = nyStore.orderPizza("cheese");
    Pizza pizza1 = chicagoStore.orderPizza("pepperoni");
}

위 처럼 추상클래스의 특징인 상속을 통해 자손 클래스에서 완성을 유도하는 방식으로(미완성 설계도) 구현한 패턴이다.

장 단점

장점

  • OCP와 DIP를 잘 지킴
  • 느슨한 결합도 유지

단점

  • 자식 클래스가 많아지면서 코드가 복잡해질 가능성이 있음

결론

팩토리 메소드 패턴은 클래스간의 결합도를 낮추기 위함이다.
객체를 직접 생성해서 사용하는 것을 방지하고 서브 클래스에 위임해서 효과적인 코드제어와 의존성을 제거함이다.

참고자료

참고 자료
Head First 디자인패턴
면접을 위한 CS 전공지식노트

This post is licensed under CC BY 4.0 by the author.