본문 바로가기
디자인 패턴

[생성 패턴] 팩토리 메서드

by qbinee 2023. 6. 19.

팩토리 메서드란

부모 클래스에서 객체들을 생성할 수 있는 인터페이스를 제공

자식 클래스들이 생성될 객체들의 유형을 변경할 수 있도록 하는 생성 패턴

문제

만약 비즈니스 로직중, 기존의 객체가 너무 결합도가 높아서 새로 생기는 로직에 적용을 못한다면 코드 베이스를 변경하는 일이 생길것

이에 새로 생기는 로직에 많은 조건문이 들어간다면 매우 복잡해질 것이다.

해결책

팩토리 매서드 패턴은 new 연산자를 사용한 객체 생성 직접 호출하는 것을 팩토리 메서드를 사용한 호출로 대체하는것을 제한한 패턴이다.

즉, 객체를 생성할 때 어떤 클레스의 인스턴스 를 만들 지 서브 클래스에서 결정한다.

적용 상황

  1. 코드에서 객체들의 정확한 유형과 의존관계를 모르는 경우 사용한다
  2. 라이브러리 또는 프레임워크의 사용자에게 내부 컴포넌트를 확장하고 싶을 때
  3. 기존 객체들의 재구축 대신 재사용하고 싶을때

장점

객체 지향의 5원칙 ( SOLID ) 중

  1. SRC( 단일 책임 원칙 ) 으로 유지관리가 가능하다
  2. OCP( 개방 폐쇄 법칙 ) 기존 코드 변경없이 기능 추가 가능

단점

패턴 구현을 위한 자식 클래스를 도입하여 코드의 복잡성이 증가한다.

예제

Product (User)

public interface User {
    void signup();
} // interface 정의
public class NaverUser implements User {
    @Override
    public void signup() {
        System.out.println("네이버 아이디로 가입");
    }
} // user interface 를 이용하여 네이버 유저 전용 로직 추가

Creator (UserFactory)

public abstract class UserFactory {

    public User newInstance() {
        User user = createUser();
        user.signup();
        return user;
    }

    protected abstract User createUser();
}
  • 추상 클래스로 UserFactory 생성
public class NaverUserFactory extends UserFactory {
    @Override
    protected User createUser() {
        return new NaverUser();
    }
}
  • 네이버 유저 팩토리 클래스 생성

Client

UserFactory userFactory = new NaverUserFactory();
User user = userFactory.newInstance();
  • 클라이언트에서는 NaverUser 에 대한 의존성 없이 사용이 가능하다

확장

기존의 코드 ( User, NaverUser, UserFactory, NaverUserFactory) 의 수정없이 새로운 Product를 만들고 싶을 때는 ?

새로운 Product

public class KakaoUser implements User {
    @Override
    public void signup() {
        System.out.println("카카오 아이디로 가입");
    }
}
  • 기존의 User Interface를 이용하여 KaKaoUser 생성

새로운 Creator

public class KakaoUserFactory extends UserFactory {
    @Override
    protected User createUser() {
        return new KakaoUser();
    }
}

새로운 Client

UserFactory userFactory = new NaverUserFactory();
User user = userFactory.newInstance();

// 위 클라이언트 코드 수정 없이 다른 곳에서 사용 가능
UserFactory kakaoUserFactory = new KakaoUserFactory();
User kakaoUser = kakaoUserFactory.newInstance();

예제 장단점

  • 확장에 열려있고 수정에는 닫혀있는 OCP 확인 가능
  • 각 객체가 각자의 역할을 수행한다. SRC 확인가능
  • 단, 코드량이 많고 분석이 어렵다.

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

[디자인 패턴] 들어가며  (0) 2023.06.19