팩토리 메소드 패턴

팩토리 메소드 패턴은 객체 생성을 Factory 클래스에서 대신 생성하게 하는 디자인 패턴입니다. 즉 객체를 생성할 때 어떤 클래스의 인스턴스를 만들지 서브클래스에서 결정하게 하는겁니다. 이 패턴은 기존의 코드의 변경 없이 확장하기 위한 패턴입니다.

 

MemberFactory는 Member 인터페이스에만 의존하고 실제로 어떤 구현체를 호출할지는 MemberFactory에서 결정하게 됩니다. 이렇게 하면 구현체가 추가되어도 기존 코드를 수정하기 않고 확장 시킬 수 있습니다.

 

 

 

팩토리 메소드 구현

 

1. Member Interface

public interface Member {

    void signup();
}


public class NaverMember implements Member{

    @Override
    public void signup() {
        System.out.println("네이버 가입");
    }
    
}

public class KakaoMember implements Member {

    @Override
    public void signup() {
        System.out.println("카카오 가입");
    }
    
}

 

 

2. MemberFactory

public abstract class MemberFactory {

    public Member newMember() {
        Member member = createMember();
        member.signup();
        return member;
    }
    
    protected abstract Member createMember();
    
}

// Java 8 이후부터 interface에 default 메서드를 통해 구현할 수 있습니다. 
// 따라서 abstract를 사용하지않고 interface를 사용해도 됩니다.
// 아래 Factory 구현체는 interface를 사용했습니다.

public interface MemberFactory {

    default Member newMember() {
        Member member = createMember();
        member.signup();
        return member;
    }
    
    Member createMember();
    
}

public class NaverMemberFactory implements MemberFactory{

    @Override
    public Member createMember() {
        return new NaverMember();
    }
    
}

public class KakaoMemberFactory implements MemberFactory{

    @Override
    public Member createMember() {
        return new KakaoMember();
    }
    
}

 

 

3. Client

public class Main {

    public static void main(String[] args) {

        MemberFactory factory = new NaverMemberFactory();
        Member member = factory.newMember();
        
        // 네이버 가입
        
    }
}

 

 

팩토리 메소드 패턴의 흐름

  1. MemberFactory 구현체인 NaverMemberFactory 객체를 생성
  2. newMember() 메소드내부에서 createMember() 메소드를 실행 -> NaverMemberFactory 클래스에서 오버라이드 한 NaverMember 객체생성
  3. signup() 메소드 실행 -> NaverMember 클래스에서 오버라이드한 signup() 메소드 호출
  4. "네이버 가입" 출력

 

구현체 확장

public class GoogleMember implements Member{

    @Override
    public void signup() {
        System.out.println("구글 가입");
    }
    
}

public class GoogleMemberFactory implements MemberFactory{

    @Override
    public Member createMember() {
        return new GoogleMember();
    }
    
}

Member 인터페이스의 구현체 GoogleMember 클래스를 추가하고 MemberFactory 인터페이스의 구현체 GoogleMemberFactory 클래스를 추가해주는 것으로 쉽게 확장할 수 있습니다.

 

 

 

패턴의 장/단점

장점

  • OCP 원칙 : 기존 코드의 수정 및 변경 없이 확장할 수 있습니다.
  • SRP 원칙 : 하나의 책임을 가지는 클래스로써 코드를 유지보수하기 쉽습니다.

단점

  • 구현체마다 각각의 Factory 클래스를 모두 구현해주어야 하기 때문에 구현체가 늘어날때마다 Factory 클래스도 함께 생성해야합니다. 따라서 관리해야하는 클래스가 증가합니다.
  • 코드의 복잡성이 증가합니다.

 

+ Recent posts