본문 바로가기

IT/디자인 패턴(Design Pattern)

[디자인 패턴] 팩토리 메소드 패턴(Factory Method Pattern)

1) 개요

팩토리 메소드 패턴은 클래스의 인스턴스를 만드는 것을 서브클래스에서 결정하도록 하는 패턴입니다.

- 장점

1. 구현 클래스 직접 접근보다 인터페이스 접근을 더 용이하게 해줍니다.

2. 클라이언트 클래스로부터 인스턴스 구현을 분리시켜 객체간의 의존성을 낮춰줍니다.

- 단점

1. 팩토리 메소드 패턴을 남용할 경우 인스턴스 생성 구조를 파악하기 복잡해집니다.


2) UML

3) 예제


1
2
3
4
5
6
7
8
9
public abstract class Product {
    public abstract String getName();
    public abstract int getPrice();
    
    @Override
    public String toString() {
        return "product Name : " + getName();
    }
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Computer extends Product{
    private String name;
    private int price;
    
    public Computer(String name, int price) {
        this.name = name;
        this.price = price;
    }
    
    public String getName() {
        return name;
    }
    
    public int getPrice() {
        return price;
    }
    
    @Override
    public String toString() {
        return "항목 :: " + this.name + ", 가격 :: "+ this.price;
    }
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Ticket extends Product {
    private String name;
    private int price;
 
    public Ticket (String name, int price) {
        this.name = name;
        this.price = price;
    }
 
    @Override
    public String getName() {
        return this.name;
    }
    @Override
    public int getPrice () {
        return this.price;
    }
    
    @Override
    public String toString() {
        return "항목 :: " + this.name + ", 가격 :: "+ this.price;
    }
}
cs


1
2
3
4
5
6
7
8
9
public class ProductFactory {
    public static Product getProduct(String type, String name, int price) {
        if ("ticket".equals(type.toLowerCase()))
            return new Ticket(name, price);
        else if ("computer".equals(type.toLowerCase()))
            return new Computer(name, price);
        return null;
    }
}
cs

1
2
3
4
5
6
7
8
9
public class Main {
    public static void main(String[] args) {
        Product ticket = ProductFactory.getProduct("ticket""한국여행"300000);
        Product computer = ProductFactory.getProduct("computer""pc"1500000);
 
        System.out.println(ticket.toString());
        System.out.println(computer.toString());
    }
}
cs


[Result]

1
2
항목 :: 한국여행, 가격 :: 300000
항목 :: pc, 가격 :: 1500000
cs