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

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

Abstract Factory Method Pattern

디자인 패턴이란?

디자인 패턴이란?

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

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

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

  

관련 객체들의 클래스들을 지정하지 않고 객체들의 모음을 생성하는 패턴
편의점 삼각 김밥에 들어가는 재료들이 모두 다 한 공장에서 오진 않았다.
재료마다 각기 다른 곳에서 와서 하나의 김밥이 되었다.

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

추상 팩토리 메서드 패턴이란?

추상 팩토리 패턴은 상세화된 서브 클래스를 정의하지 않고, 서로 관련성이 있거나 독립적인 여러 객체를 생성하기 위한 인터페이스를 제공한다.
최근 Spring Security에서 OAuth2를 쓰면서 각개의 소셜로그인에 계정에 맞는 user 정보를 api로 주게 되는데
이러한 점이 추상 팩토리 메소드로 생각해 볼 수 있을꺼 같아 예제코드를 작성해보았다.

img

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
45
46
팩토리메서드와 다를게 없는...
abstract class User {
    public abstract String name();
    public abstract String email();
}

class kakaoUser extends User{
    private String name;
    private String email;

    public kakaoUser(String name, String email) {
        this.name = name;
        this.email = email;
    } 
    
    @Override
    public String name() {
        return this.name;
    }

    @Override
    public String email() {
        return this.email;
    }
}


class googleUser extends User{
    private String name;
    private String email;

    public googleUser(String name, String email) {
        this.name = name;
        this.email = email;
    }

    @Override
    public String name() {
        return this.name;
    }

    @Override
    public String email() {
        return this.email;
    }
}
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
추상팩토리의 역할을 하는 인터페이스 or 추상클래스가 필요

interface AbstractOAuth2API {
    public User createUser();
}

class kakaoOauth2Factory implements AbstractOAuth2API {

    @Override
    public User createUser() {
        return new kakaoUser("홍길동", "카카오이메일");
    }
}


class googleOauth2Factory implements AbstractOAuth2API {

    @Override
    public User createUser() {
        return new googleUser("홍길동", "구글이메일");
    }
}

/*client 코드와의 접점이자 서브클래스를 생성하는데 도움주는 클래스*/
class oauth2Factory{
    public static User getUser(AbstractOAuth2API api) {
        return api.createUser();
    }
}


public class codeTester {
    public static void main(String[] args) {
        User user1 = oauth2Factory.getUser(new kakaoOauth2Factory());
        User user2 = oauth2Factory.getUser(new googleOauth2Factory());
        System.out.println(user1.name()+" "+ user1.email());
        System.out.println(user2.name()+" "+ user2.email());
    }
}
//홍길동 카카오이메일
//홍길동 구글이메일

장 단점

장점

  • 재사용성이 좋다 * 구체적인 클래스를 분리하므로
  • 서로가 달라도 어쨌든 묶여 있는 점에서 일관성이 있다.

단점

  • 새로운 인터페이스와 수많은 클래스가 패턴과 함께 도입되기 때문에 코드가 생각보다 복잡해질 수 있다.

결론

구현클래스에 의존하고 싶지않고 다양한 객체에 적용하고 싶을때 사용하자.

참고자료

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

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