오늘은 생성 패턴에 대해서 알아보자.
1. 생성 패턴
생성 패턴은 객체 생성 방식을 다루는 디자인 패턴이다. 객체 생성 과정에서의 문제를 해결하고 코드의 유연성과 재사용성을 높이는 역할을 한다.
생성 패턴의 종류로는 싱글톤, 팩토리, 추상팩토리, 빌더, 프로토타입 패턴이 있다.
여기서 싱글톤과 팩토리 패턴에 대해서 자세하게 살펴보면 다음과 같다.
1-1. 싱글톤 패턴 (Singleton Pattern)
싱글톤 패턴은 클래스의 오직 하나의 인스턴스만 가지는 패턴이다. 다수의 인스턴스를 생성하지 않고, 동일한 인스턴스를 모든 모듈에서 공유하며 사용한다.
[장점]
- 리소스 절약 : 하나의 인스턴스를 여러 곳에서 공유하므로 객체 생성 비용이 줄어든다.
- 일관성 유지 : 단일 인스턴스를 사용하므로 데이터가 항상 일관성을 가진다.
[단점]
- 높은 의존성 : 싱글톤 인스턴스를 공유하므로 인해 모듈 간의 의존성이 증가한다.
- 테스트 어려움 : 단위 테스트 시 독립적인 인스턴스를 생성하기 어려워 Test Driven Development (TDD) 환경에 적합하지 않다. 단위 테스트는 순서와 관계없이 독립적으로 실행 가능해야 하지만, 싱글톤 패턴은 이를 어렵게 만든다.
[코드] - JAVA
코드를 통해 살펴보자. 다음과 같이 하나의 인스턴스를 공유할 수 있다.
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
public class Main {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2); // true
}
}
1-2. 팩토리 패턴 (Factory Pattern)
팩토리 패턴은 객체 생성 로직을 상위 클래스에서 정이하고, 실제 객체 생성은 하위 클래스에서 수행하도록 분리한 패턴이다.
예를 들어, 공장으로 비유할 수 있다. 상위 클래스는 "제품의 뼈대"를 결정하고, 하위 클래스는 "제품을 만드는 방법"을 정의한다.
[장점]
- 유연성 : 상위 클래스는 객체 생성 방식에 대해 알 필요가 없다. 따라서 새로운 객체 유형이 추가되어도 상위 클래스를 수정하지 않아도 된다.
- 유지보수성 향상 : 객체 생성 로직이 한 곳에 집중되어 관리되므로, 유지보수성이 증가한다.
[단점]
- 복잡성 증가 : 객체 생성 로직이 추가되면서 코드 구조가 복잡해질 위험이 있다.
[코드] - JAVA
코드로 살펴보자면 다음과 같다. 여기서 Product는 제품의 뼈대를 결정할 뿐이다. 구체적인 생성 방법은 하위 클래스에서 정의된다.
// 상위 클래스: 뼈대를 정의
abstract class Product {
public abstract void create();
}
// 하위 클래스: 구체적인 생성 방법 정의
class ConcreteProductA extends Product {
@Override
public void create() {
System.out.println("Product A created");
}
}
class ConcreteProductB extends Product {
@Override
public void create() {
System.out.println("Product B created");
}
}
// 팩토리 클래스
class ProductFactory {
public static Product getProduct(String type) {
if (type.equals("A")) {
return new ConcreteProductA();
} else if (type.equals("B")) {
return new ConcreteProductB();
}
throw new IllegalArgumentException("Unknown product type");
}
}
public class Main {
public static void main(String[] args) {
Product productA = ProductFactory.getProduct("A");
productA.create();
Product productB = ProductFactory.getProduct("B");
productB.create();
}
}'📚 CS > 그 외' 카테고리의 다른 글
| [CS] 디자인 패턴 - 행동 패턴 (1) | 2024.11.21 |
|---|---|
| [CS] 디자인 패턴 - 구조 패턴 (0) | 2024.11.20 |
| GitHub의 동작 원리, 작업 공간 (2) | 2024.11.02 |
| [JAVA] 클래스 vs 객체 vs 인스턴스, 무엇이 다를까? (0) | 2024.09.24 |
| JSON - 직렬화, 역직렬화 (0) | 2024.09.23 |