본문 바로가기

소프트웨어 공학

(디자인 패턴) Factory Method Pattern

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

 

Factory Method Pattern


1. 분류

- Design Pattern 분류 중, Creational Pattern에 속합니다.

 

2. 사용의 의도(intent)

- 객체를 생성하기 위한 인터페이스를 정의하고, 어떤 클래스(자료형)의 인스턴스를 생성할지는 서브클래스가 결정하도록 합니다.

 

3. 장점

- 애플리케이션별 클래스를 인스턴스화 하지 않음으로써 더욱 유연하고 재사용이 가능합니다.

- 코드는 Product 클래스의 인터페이스만 다루지만 이 인터페이스를 지원하는 모든 Concrete Product클래스를 사용하는 것이 가능합니다.

 

  

4. 구성 요소

- Product, ConcreteProduct, Creator, ConcreteCreator

 

이미지 출처 : 학부 수업

Factory Method Pattern 구성도

 

ConcreteCreator는 매칭 되는 ConcreteProduct를 생산할 책임을 갖습니다.

위 그림만 보고 바로 적용하기는 쉽지 않을 것입니다.

아래 예시를 보고 적용해보면 좋을 것 같습니다.

 

johngrib.github.io/wiki/factory-method-pattern/

 

팩토리 메소드 패턴 (Factory Method Pattern)

객체를 생성하기 위한 인터페이스를 정의하고, 인스턴스 생성은 서브클래스가 결정하게 한다

johngrib.github.io



 

내가 만든 예제


공부하고 직접 만들어본 예제입니다.

어디에 적용할까 생각하다가,

요즘 진행하는 프로젝트의 소셜 로그인 파트에 적용해보면 좋을 것 같다는 생각이 들었습니다.

 

판단 근거

1. 구글, 페이스북 등 다양한 Provider를 갖는다.

2. 런타임 시에 Provider별로 갈아 끼우면서 유저를 생산(Creation)한다.

3. 그러므로, 객체를 생성하기 위한 인터페이스를 정의하고 어떤 클래스(Provider별)를 생성할지 Provider별로 정의된 Subclass들이 판단해야 한다고 생각한다.

 

 

설계도

 

 

코드

 

1. UserFactory

 

public abstract class UserFactory {

    public final SocialUser createUser() {
        return createSocialUser();
    }

    protected abstract SocialUser createSocialUser();

}

 

2. SocialUser

 

public abstract class SocialUser {

    public abstract String getEmail();
    public abstract String getUsername();

}

 

3. GoogleUserFactory

 

public class GoogleUserFactory extends UserFactory{

    @Override
    protected SocialUser createSocialUser() {
        return new GoogleUser();
    }
}

 

4. GoogleUser

 

편의상 일반 String으로 삽입했습니다.

public class GoogleUser extends SocialUser {

    @Override
    public String getEmail() {
        return "audgnssweet@gmail.com";
    }

    @Override
    public String getUsername() {
        return "myeonghun jeong";
    }
}

 

5. 사용

 

UserFactory userFactory = new GoogleUserFactory();  //런타임시 결정할 수 있도록 한다
final SocialUser socialUser = userFactory.createUser();  //userFactory를 사용하지만, 실제로는 GoogleUserFactory가 Product Type 결정중

System.out.println(socialUser.getEmail());
System.out.println(socialUser.getUsername());

 

Factory Method Pattern에 대해서 알아보았습니다.

'소프트웨어 공학' 카테고리의 다른 글

(디자인 패턴) Composite Pattern  (0) 2021.04.16
(디자인 패턴) Adaptor 패턴  (0) 2021.04.16
디자인 패턴 기본  (0) 2021.04.16
(UML) Activity Diagram & State Machine Diagram  (0) 2021.04.09
(UML) Sequence Diagram  (0) 2021.04.09