반응형
디자인 패턴은 소프트웨어 개발에서 자주 반복되는 문제를 해결하기 위한 템플릿 솔루션을 제공합니다. 싱글톤 패턴, 팩토리 패턴, 리포지토리 패턴은 각각 다른 목적과 사용 사례를 가지고 있습니다. 아래에 각 패턴의 개념과 차이점을 설명하겠습니다.
싱글톤 패턴 (Singleton Pattern)
개념
- 목적: 클래스의 인스턴스가 오직 하나만 생성되도록 보장하고, 이 인스턴스에 대한 전역적인 접근을 제공하는 패턴입니다.
- 사용 사례: 로깅, 설정 파일 관리, 스레드 풀, 데이터베이스 연결 관리 등 하나의 인스턴스만 필요한 경우.
예시
public class Singleton {
private static Singleton instance;
private Singleton() {
// private 생성자
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
팩토리 패턴 (Factory Pattern)
개념
- 목적: 객체 생성의 코드를 캡슐화하여 객체 생성을 위한 인터페이스를 제공하는 패턴입니다.
- 사용 사례: 구체적인 클래스 이름을 지정하지 않고 객체를 생성해야 하는 경우, 객체 생성 로직이 복잡한 경우.
예시
public interface Product {
void use();
}
public class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("Using Product A");
}
}
public class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("Using Product B");
}
}
public class ProductFactory {
public static Product createProduct(String type) {
if (type.equals("A")) {
return new ConcreteProductA();
} else if (type.equals("B")) {
return new ConcreteProductB();
}
throw new IllegalArgumentException("Unknown product type");
}
}
리포지토리 패턴 (Repository Pattern)
개념
- 목적: 데이터 액세스 로직을 비즈니스 로직과 분리하여, 데이터 소스에 대한 추상화를 제공하는 패턴입니다.
- 사용 사례: 데이터 액세스와 도메인 로직을 분리하여 코드의 가독성과 유지보수성을 높여야 하는 경우, 다양한 데이터 소스 (DB, 파일, 외부 서비스 등)를 사용하는 경우.
예시
public class User {
private Long id;
private String name;
// getters and setters
}
public interface UserRepository {
void save(User user);
User findById(Long id);
List<User> findAll();
}
public class UserRepositoryImpl implements UserRepository {
private Map<Long, User> database = new HashMap<>();
@Override
public void save(User user) {
database.put(user.getId(), user);
}
@Override
public User findById(Long id) {
return database.get(id);
}
@Override
public List<User> findAll() {
return new ArrayList<>(database.values());
}
}
요약
- 싱글톤 패턴 (Singleton Pattern)
- 목적: 클래스의 단일 인스턴스를 보장
- 사용 사례: 전역적으로 하나의 인스턴스만 필요한 경우
- 팩토리 패턴 (Factory Pattern)
- 목적: 객체 생성 로직을 캡슐화
- 사용 사례: 객체 생성 로직을 분리하여 유연성을 제공해야 하는 경우
- 리포지토리 패턴 (Repository Pattern)
- 목적: 데이터 액세스 로직을 추상화하여 비즈니스 로직과 분리
- 사용 사례: 데이터 소스와 도메인 로직을 분리하여 유지보수성을 높여야 하는 경우
각 패턴은 특정 상황에서 유용하며, 올바르게 사용되면 코드의 구조와 유지보수성을 크게 향상시킬 수 있습니다.
반응형