Java Simple Factory 패턴 객체 생성 책임 위임 방법
🛠️ 객체 생성 로직을 별도 팩토리 클래스에 맡겨 코드 유지보수를 쉽게 하는 비법
Java 디자인 패턴 중 Simple Factory 패턴은 객체 생성 책임을 팩토리 클래스에 위임하여 클라이언트 코드의 복잡성을 줄이고, 확장성과 유지보수성을 높이는 방법입니다.
직접 객체를 생성하지 않고, 팩토리 메서드를 통해 필요한 인스턴스를 받아 사용하기 때문에 코드가 더욱 깔끔해지고 관리하기 쉬워집니다.
이번 글에서는 Simple Factory 패턴의 개념부터 구현 방법, 장단점, 그리고 실제 프로젝트에서 어떻게 활용하는지까지 자세히 설명합니다.
초보자도 쉽게 이해할 수 있도록 기본 원리와 예제 코드를 중심으로 구성했으니, 꼭 참고해 보세요.
📋 목차
🔗 Simple Factory 패턴 기본 개념
Simple Factory 패턴은 객체 생성의 책임을 별도의 팩토리 클래스에 위임하는 디자인 패턴입니다.
클라이언트는 직접 객체를 생성하지 않고, 팩토리 메서드를 호출해 필요한 인스턴스를 얻습니다.
이렇게 하면 객체 생성 코드가 분리되어 클라이언트 코드가 더 깔끔해지고 유지보수가 쉬워집니다.
팩토리 클래스는 입력받은 파라미터나 조건에 따라 다양한 타입의 객체를 생성할 수 있으므로,
코드의 유연성과 확장성이 높아지는 장점도 있습니다.
단, Simple Factory는 엄격한 디자인 패턴은 아니며, 팩토리 메서드 패턴과 혼동되기도 하지만 둘은 구분됩니다.
🛠️ Simple Factory 구현 방법
Simple Factory 구현은 팩토리 클래스를 만들어, 클라이언트가 요청한 타입에 따라 적절한 객체를 생성해 반환하는 구조입니다.
주로 정적 메서드를 활용해 객체 생성 메서드를 제공합니다.
public class SimpleFactory {
public static Product createProduct(String type) {
switch(type) {
case "A":
return new ProductA();
case "B":
return new ProductB();
default:
throw new IllegalArgumentException("Unknown product type");
}
}
}
// 제품 인터페이스 및 구현체 예시
interface Product {
void use();
}
class ProductA implements Product {
public void use() {
System.out.println("Product A 사용");
}
}
class ProductB implements Product {
public void use() {
System.out.println("Product B 사용");
}
}
이처럼 클라이언트는 SimpleFactory.createProduct(“A”)를 호출해 필요한 객체를 받을 수 있습니다.
생성 로직이 팩토리 내부에 숨겨져 있어 클라이언트 코드는 매우 간결해집니다.
⚙️ Simple Factory의 장단점
Simple Factory 패턴은 객체 생성 로직을 한 곳에 집중시켜 코드 중복을 줄이고 관리하기 쉽게 만듭니다.
또한, 클라이언트 코드를 단순화하여 유지보수를 용이하게 하는 장점이 있습니다.
하지만 단점도 존재합니다.
팩토리 클래스가 여러 객체 생성 책임을 갖게 되어 단일 책임 원칙을 위반할 수 있고,
객체 종류가 많아지면 팩토리 메서드가 복잡해져 유지보수가 어려워질 수 있습니다.
또한, 새로운 제품 클래스를 추가할 때마다 팩토리 클래스를 수정해야 하므로, 확장성 측면에서는 한계가 있습니다.
이럴 때는 팩토리 메서드 패턴이나 추상 팩토리 패턴 같은 더 복잡한 패턴을 고려하는 것이 좋습니다.
🔌 실제 사용 예제
Simple Factory 패턴은 다양한 상황에서 객체 생성 책임을 분리하는 데 유용합니다.
예를 들어, GUI 프로그램에서 버튼, 체크박스 등 UI 컴포넌트 생성을 팩토리에 위임하거나, 메시지 전송 시스템에서 SMS, 이메일, 푸시 알림 객체를 팩토리로 생성하는 경우가 많습니다.
// 메시지 전송 팩토리 예제
public class MessageFactory {
public static Message createMessage(String channel) {
switch(channel) {
case "SMS":
return new SmsMessage();
case "Email":
return new EmailMessage();
case "Push":
return new PushMessage();
default:
throw new IllegalArgumentException("Unknown channel");
}
}
}
interface Message {
void send(String to, String content);
}
class SmsMessage implements Message {
public void send(String to, String content) {
System.out.println("SMS 전송: " + to + " - " + content);
}
}
class EmailMessage implements Message {
public void send(String to, String content) {
System.out.println("Email 전송: " + to + " - " + content);
}
}
class PushMessage implements Message {
public void send(String to, String content) {
System.out.println("푸시 알림 전송: " + to + " - " + content);
}
}
클라이언트는 단순히 MessageFactory.createMessage(“SMS”)를 호출해 SMS 메시지 객체를 받아 사용하면 됩니다.
팩토리가 객체 생성 로직을 모두 관리해 코드의 결합도를 낮추고 유연성을 높이는 좋은 예입니다.
💡 Simple Factory vs Factory Method 비교
Simple Factory는 팩토리 클래스를 통해 객체 생성을 집중 관리하는 반면, Factory Method 패턴은 서브클래스에서 객체 생성 방식을 결정하는 점이 다릅니다.
즉, Simple Factory는 단일 팩토리 클래스가 다양한 객체를 생성하는 반면, Factory Method는 각 서브클래스가 자신만의 생성 메서드를 구현합니다.
Factory Method는 확장성이 뛰어나고, 새로운 제품을 추가할 때 기존 코드를 수정하지 않아도 되는 장점이 있지만,
구현이 복잡하고 클래스 수가 늘어날 수 있습니다.
반면 Simple Factory는 구현이 단순하지만, 팩토리 클래스가 커지고 수정 빈도가 늘어날 수 있다는 단점이 있습니다.
따라서 프로젝트의 복잡도와 요구사항에 따라 적절한 패턴을 선택하는 것이 중요합니다.
❓ 자주 묻는 질문 (FAQ)
Simple Factory 패턴이란 무엇인가요?
Simple Factory와 Factory Method의 차이는 무엇인가요?
Simple Factory의 단점은 무엇인가요?
Simple Factory는 언제 사용하는 것이 좋은가요?
Simple Factory를 적용할 때 주의할 점은?
Simple Factory는 디자인 패턴인가요?
Simple Factory와 Abstract Factory의 차이점은?
Simple Factory는 코드 유지보수에 어떤 도움을 주나요?
📌 Simple Factory 패턴 핵심 정리
Simple Factory 패턴은 객체 생성 책임을 별도의 팩토리 클래스에 위임해 클라이언트 코드를 단순화하고, 객체 생성 로직을 집중 관리하는 효과적인 방법입니다.
이를 통해 코드 유지보수가 쉬워지고, 확장성도 일부 개선할 수 있습니다.
하지만 팩토리 클래스가 비대해질 수 있고, 새로운 제품 추가 시 수정이 필요해 확장성에 제한이 있습니다.
복잡한 요구사항에는 팩토리 메서드나 추상 팩토리 패턴을 고려하는 것이 좋습니다.
이 글에서 소개한 개념과 예제를 참고해 적절히 적용한다면, 개발 효율과 코드 품질 향상에 큰 도움이 될 것입니다.
🏷️ 관련 태그 : Java디자인패턴, SimpleFactory, 객체생성패턴, 팩토리패턴, 소프트웨어설계, 코드유지보수, 객체지향프로그래밍, 디자인패턴기초, 개발패턴, 팩토리클래스