Factory Method Pattern


객체를 생성하기 위한 new 키워드를 호출하는 부분을 하위 클래스에 위임하는 패턴이다.

Factory(공장)에서만 객체를 생성하여, 하위 클래스에서 어떤 클래스를 생성할지 결정한다.


문제 코드

1
2
3
4
5
6
7
8
9
CardGame cardgame = null;
 
 if (type == "Poker") { 
    cardgame = new PokerGame(); 
}
else if (type == "BlackJack") { 
    cardgame = new BlackJackGame(); 
}
 
cs

카드게임에 대한 코드가 있다. 입력에 따라 다른 카드게임을 구현한다.

위의 방법으로 구현하게 될 때 변경이나 확장할 요소가 생기면, 카드게임과 관련된 PokerGame(), BlackJackGame() 메서드를 매번 수정해야 하는 문제가 발생한다.



이런 문제를 방지하기 위해 팩토리 메서드 패턴을 사용하여

직접 객체를 생성해 사용하는 것을 방지하고 

클래스간 결합도(클래스의 변경이 발생했을 때 다른 클래스에 얼마나 영향을 주는지)를 낮춰 

유연성과 확장성 등의 유지보수에 용이하도록 한다.



팩토리 메서드 패턴을 적용한 코드

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
// 카드게임 추상 클래스
public abstract class CardGame {
    public abstract String getName();
}
 
// 포커게임 구현 클래스
public class PokerGame extends CardGame { 
    @Override
    public String getName() { return "PokerGame"; }
}
 
// 카드게임 팩토리 클래스
public class CardGameFactory {
    public static CardGame createCardGame(String type) {
        if (type == "Poker") { 
            return new PokerGame(); 
        }
        else if (type == "BlackJack") { 
            return new BlackJackGame(); 
        }
        return null;
    }
}
 
// 메인
public class Main {
    public static public void main(String[] args){
        CardGameFactory factory = new CardGameFactory();
        CardGame cardGame1 = factory.createCardGame("Poker");
        CardGame cardGame2 = factory.createCardGame("BlackJack");
    
        System.out.println(cardGame1.getName());  // PokerGame
        System.out.println(cardGame2.getName());  // BlackJackGame
}
 
cs

new는 CardGameFactory 클래스 안에서만 사용되며, createCardGame 메서드를 통해 생성된 객체를 가져온다.

객체 생성에 대해서는 한 곳(팩토리)에서만 관리하게 된다.


또한 main에는 new 키워드를 사용하여 객체를 생성하지 않아, 어떤 객체가 생성되었는지 신경 쓸 필요없이 반환된 객체만 사용한다.

CardGame 클래스에서 변경이 발생해도 main에서 변경되는 것을 최소화할 수 있다.


또한 카드게임의 동일한 기능은 유지하면서, 나누어진 여러 종류의 카드게임에 대한 고유한 기능을 정의할 수 있다.




참고 출처
디자인패턴: 팩토리패턴(FACTORY PATTERN) - http://friday.fun25.co.kr/blog/?p=280
팩토리 메소드 패턴(Factory Method Pattern) - http://mygumi.tistory.com/264


'Design Pattern' 카테고리의 다른 글

Singleton pattern (싱글턴 패턴)  (0) 2018.07.20


1단계: 모호성 해소 

객체 지향 설계의 첫 번째는, 누가 그것을 사용할 것이며 어떻게 사용할 것인지에 대해 생각해야 한다.

커피 메이커에 대한 객체 지향적 설계를 한다고 했을 때, 어떤 용도로 쓰이느냐에 따라 설계 자체가 완전히 뒤바뀐다.

열 가지 이상의 제품을 만들어야 하는 기계일 수도 있고, 블랙 커피만 만드는 간단한 기계일 수도 있기 때문이다.


2단계: 핵심 객체 설계

시스템에 넣을 핵심 객체가 무엇인지 생각해야 한다.

식당을 설계한다 했을 때, 이 때의 핵심 객체는 테이블, 손님, 식사, 종업원 등이 있다.


3단계: 관계 분석

객체 사이의 관계를 분석한다.

어떤 객체가 어떤 객체에 속해 있는지, 다른 객체로부터 상속받아야 하는 객체가 있는지, 관계는 일대다인지 다대다인지 등을 생각할 수 있다.

예를 들어, 손님일행(Party)은 손님(Guests) 배열을 가져야하며, 

각 테이블(Table)은 손님일행(Party)을 하나만 가질 수 있지만 각 손님일행(Party)은 테이블(Table)을 여러 개 가질 수 있다.


4단계: 행동 분석

객체가 수행해야 하는 핵심 행동에 대해 생각한다.

예를 들면, 손님일행(Party)이 식당(Restaurant)에 들어온다.

일행(Party) 중 한 사람(Guest)이 종업원(Employee)에게 자리(Table)을 부탁한다.

이 때 종업원(Employee)은 대기리스트(Reservation)을 확인한 다음, 

자리(Table)가 있으면 해당 손님일행(Party)에게 테이블(Table)을 배정한다.

자리(Table)가 없다면 손님일행(Party)은 대기리스트(Reservation) 맨 마지막에 추가된다.

어떤 한 손님일행(Party)이 식사를 마치고 나가면 한 자리(Table)가 비게 되고

그 자리(Table)는 대기리스트(Reservation)의 맨 위 손님일행(Party)에게 할당된다.




참고도서: 코딩인터뷰 완전분석

'Java' 카테고리의 다른 글

상속 (Inheritance)  (0) 2018.11.27
객체지향 프로그래밍 (Object-Oriented Programming)  (0) 2018.11.26
static과 final  (0) 2018.08.20
직렬화 (Serialization)  (0) 2018.08.04
Overloading (오버로딩)  (0) 2018.07.28

문제 출처: https://www.acmicpc.net/problem/1932



DP(Dynamic Programming)로 푼다.


arr[i][j] 값은 arr[i-1][j-1]값과 arr[i-1][j]값 중 큰 값과 arr[i][j]값을 더한 값이다.

arr[i-1][j-1]가 범위에서 벗어나면 0으로 초기화하여 비교한다.


arr[0][0] = 7

arr[1][0] = max(arr[0][-1], arr[0][0]) + arr[1][0] = max(0, 7) + 3 = 10

arr[1][1] = max(arr[0][0], arr[0][1]) + arr[1][1] = max(7, 0) + 8 = 15

arr[2][0] = max(arr[1][-1], arr[1][0]) + arr[2][0] = max(0, 10) + 8 = 18

arr[2][1] = max(arr[1][0], arr[1][1]) + arr[2][1] = max(10, 15) + 1 = 16

arr[2][2] = max(arr[1][1], arr[1][2]) + arr[2][2] = max(15, 0) + 0 = 15


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
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(reader.readLine());
        int[][] arr = new int[n][n];
 
        StringTokenizer tokenizer;
        for(int i=; i<n ; i++){
            tokenizer = new StringTokenizer(reader.readLine());
            for(int j=; j<i+; j++){
                arr[i][j] = Integer.parseInt(tokenizer.nextToken());
            }
        }
 
        for(int i=; i<n ; i++){
            for(int j=; j<i+; j++){
        // left(arr[i-1][j-1]) 값과 right(arr[i-1][j]) 값 중 큰 값을 arr[i][j] 값에 더한다.
                arr[i][j] += Math.max((j==0) ? : arr[i-1][j-1], arr[i-1][j]);
            }
        }
 
        Arrays.sort(arr[n-1]);
        System.out.println(arr[n-1][n-1]);
    }
}
cs


'Algorithm' 카테고리의 다른 글

백준 1149번: RGB거리  (0) 2018.11.01
백준 2749번: 피보나치 수 3  (0) 2018.10.31
백준 2748번: 피보나치 수 2  (0) 2018.10.31
백준 2747번: 피보나치 수  (0) 2018.10.31
백준 2667번: 단지번호붙이기  (0) 2018.10.26

+ Recent posts