빠에야는 개발중

팩토리 패턴 본문

공부/디자인패턴

팩토리 패턴

빠에야좋아 2018. 3. 14. 22:40

팩토리 메소드 패턴이란, “어떤 인스턴스의 생성을 하위 클래스에서 담당하도록 하는 패턴”이다. 팩토리 메소드 패턴을 사용하면 조건에 따라 다른 종류의 구상 인스턴스를 생성해줄 수 있기 때문에 추상화의 효과를 볼 수 있다. 더불어 팩토리 메소드에 static을 사용하면 인스턴스를 싱글톤으로 관리할 수도 있다.


예를 들어 다음 코드를 보자. 치킨 가게에서 여러 종류의 치킨을 판매하고 싶다. 그런데 들어가는 재료의 차이를 빼고는 모든 공정이 동일하다. 그렇다면 각각의 메뉴별로 하위 클래스를 만들어줘서 그 속에서 인스턴스를 생성하면 추가되는 작업들은 팩토리 메소드만 수정할 뿐 다른 공통의 작업들은 수정할 필요가 없어진다(OCP). 또한 각각의 메소드들을 분리하였고 객체를 생성하는 메소드도 따로 존재하기 때문에 SRP도 만족하고 있다.

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
36
37
38
39
40
41
42
43
44
//Chicken.java
public class Chicken {
    String bird;
    int size;
    String fryer;
    int time;
    
    public Chicken(String bird, int size, String fryer, int time) {
        super();
        this.bird = bird;
        this.size = size;
        this.fryer = fryer;
        this.time = time;
    }
    public String getBird() {
        return bird;
    }
    public void setBird(String bird) {
        this.bird = bird;
    }
    public int getSize() {
        return size;
    }
    public void setSize(int size) {
        this.size = size;
    }
    public String getFryer() {
        return fryer;
    }
    public void setFryer(String fryer) {
        this.fryer = fryer;
    }
    public int getTime() {
        return time;
    }
    public void setTime(int time) {
        this.time = time;
    }
    @Override
    public String toString() {
        return "Chicken [bird=" + bird + ", size=" + size + ", fryer=" + fryer + ", time=" + time + "]";
    }
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//ChickenStore
public class ChickenStore {
    public void cut() {
        System.out.println("자릅니다.");
    }
    
    public void wear() {
        System.out.println("튀김옷을 입힙니다.");
    }
    
    public void fry() {
        System.out.println("튀깁니다.");
    }
    
    private ChickenFactory chickenFactory;
 
    public Chicken getChicken(String name) {
        return chickenFactory.makeChicken(name);
    }
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
//ChickenFactory.java
public class ChickenFactory {
    public static Chicken makeChicken(String name) {
        if(name == "후라이드") {
            return new Chicken("뼈"10"튀김가루"10);
        } else if(name == "크런키") {
            return new Chicken("순살"5"빵가루"12);
        }
        return null;
    }
}
 
cs


위에서는 생성자 형태로 만들어주었지만 setter를 사용할 수도 있을 것이다.

'공부 > 디자인패턴' 카테고리의 다른 글

빌더 패턴  (0) 2018.03.19
싱글톤 패턴  (0) 2018.03.15
템플릿 메소드 패턴  (0) 2018.03.14
Comments