[Spring] Factory method

노유성·2023년 7월 13일
0
post-thumbnail

Factory method란?

Factory Method(팩토리 메서드)는 소프트웨어 디자인 패턴 중 하나입니다. 이 패턴은 객체 생성을 처리하는 방법을 추상화하여, 클라이언트 코드에서 구체적인 클래스의 인스턴스 생성을 캡슐화하는 데 사용됩니다.
Factory Method는 "생성할 객체의 클래스를 서브클래스에서 결정하도록 하는 패턴"이라고 설명할 수 있습니다. 이는 객체 생성에 관련된 복잡성을 감소시키고, 유연성과 확장성을 제공하며, 코드의 재사용성을 높일 수 있습니다.
일반적으로 Factory Method 패턴은 다음과 같은 구성 요소를 포함합니다

  1. Creator(생산자) 인터페이스: 객체를 생성하는 추상 클래스나 인터페이스로, 실제 생성 작업을 수행하는 팩토리 메서드를 선언합니다.
  2. ConcreteCreator(구체적인 생산자): Creator를 상속받아 실제 객체 생성을 담당하는 클래스로, 팩토리 메서드를 구현합니다.
  3. Product(제품) 인터페이스: 생성될 객체의 공통 인터페이스를 정의합니다.
  4. ConcreteProduct(구체적인 제품): Product를 구현하는 클래스로, 실제로 생성되는 객체입니다.

간단하게 요약하자면 생성할 객체에 대한 구체적인 정보를 추상화 해놓고 이를 overriding한 서브 클래스에서 어떤 class의 객체인지를 명시하고 해당 객체를 반환해서 사용하는 패턴을 Factory method라고 한다. 이렇게 하면 Client 측에서 객체의 class에 대해 명시적으로 알 필요가 없으며 interface를 통해 객체를 생성, 사용할 수 있다.

가령 내가 3분류의 user를 처리할 것이라고 하면 user 인터페이스를 생성하고 이를 오버라이딩 하여 각각의 3분류에 대한 user class를 생성한다. 그리고 user interface를 활용해서 객체를 생성하는 creator interface를 생성하고 각각의 user class에 mapping되는 creator sub class를 생성한다. 이렇게 하면 client는 interface에만 의존할 수 있다.

예제

User interface

유저의 정보와 유저가 갖고 있는 기능에 대해서 명시한 interface

public interface User {
    void signUp();
}

User 구현체

public class NaverUser implements User {
    @Override
    public void signUp() {
        System.out.println("네이버 유저 입니다.");
    }
}

public class KakaoUser implements User {
    @Override
    public void signUp() {
        System.out.println("카카오 유저입니다.");
    }
}

각각 유저를 상속받아 구현된 구체이다.

UserFactory abstract class

public abstract class UserFactory {
    public User newInstance() {
        User user = createUser();
        user.signUp();
        return user;
    }
    protected abstract User createUser();
}

유저를 생성하고 회원가입을 시킨 후에 해당 유저를 반환하는 class이다.

UserFactory 구현체

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

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

client

// 어떤 종류의 유저를 생상할 것인지
        UserFactory userFactory = new NaverUserFactory();
//        UserFactory userFactory = new KakaoUserFactory(); // 다른 유저 팩토리도 생성가능
        
        // 유저 팩토리에서 생산한 유저, client는 어떤 유저가 생성되는 지 모름
        User user = userFactory.newInstance();
profile
풀스택개발자가되고싶습니다:)

0개의 댓글