팩토리 메소드 패턴
팩토리 메소드 패턴은 객체 생성을 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();
// 네이버 가입
}
}
팩토리 메소드 패턴의 흐름
- MemberFactory 구현체인 NaverMemberFactory 객체를 생성
- newMember() 메소드내부에서 createMember() 메소드를 실행 -> NaverMemberFactory 클래스에서 오버라이드 한 NaverMember 객체생성
- signup() 메소드 실행 -> NaverMember 클래스에서 오버라이드한 signup() 메소드 호출
- "네이버 가입" 출력
구현체 확장
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 클래스도 함께 생성해야합니다. 따라서 관리해야하는 클래스가 증가합니다.
- 코드의 복잡성이 증가합니다.
'디자인패턴 > 생성' 카테고리의 다른 글
자바(JAVA) - 싱글톤 패턴(Singleton Pattern) (0) | 2024.02.23 |
---|---|
자바(JAVA) - 프로토타입 패턴(Prototype Pattern) (0) | 2024.02.01 |
자바(JAVA) - 빌더 패턴(Builder Pattern) (0) | 2024.01.29 |
자바(JAVA) - 추상 팩토리 패턴(Abstract Factory Pattern) (0) | 2024.01.22 |