(Factory · Singleton · Builder · Facade · Observer)
SOLID 원칙만으로는 구조를 설명하기 부족할 때,
반복적으로 검증된 설계 해법에 이름을 붙인 것이 디자인 패턴
SOLID까지 지켰는데도 이런 문제가 남는다.
| 분류 | 목적 |
|---|---|
| Creational | 객체 생성 |
| Structural | 객체 구조 |
| Behavioral | 객체 행동 |
(생성 패턴)
객체 생성은 단순히 new가 아니다.
이 로직을 클라이언트가 알게 되면 OCP, DIP가 동시에 깨진다.
객체 생성 책임을 분리한다
Car car = new Car(
new Engine(),
new Tire(),
200,
true
);
class CarFactory {
static Car createSportCar() {
return new Car(...);
}
}
“공장 자체를 추상화한다”
Creator ──▶ Product
ConcreteCreator ──▶ ConcreteProduct
(생성 패턴)
어떤 객체는 여러 개 존재하면 논리적으로 틀린다.
프로그램 전체에서 단 하나의 인스턴스만 존재
class Singleton {
private static Singleton instance;
private Singleton() {}
static Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}
}
👉 그래서 필요할 때만 사용
| 구분 | Singleton | Monostate |
|---|---|---|
| 객체 수 | 1 | 여러 개 |
| 상태 | 공유 | 공유 |
| 객체 비교 | 항상 같음 | 다름 |
(생성 패턴)
new User(name, age, address, phone, email, isAdmin);
“어떻게 만들지”를 객체로 분리
Builder ──▶ Product
Director ──▶ Builder (선택)
User user = UserBuilder()
.name("kim")
.age(20)
.email("a@a.com")
.build();
| 구분 | Factory | Builder |
|---|---|---|
| 초점 | 무엇을 만들지 | 어떻게 만들지 |
| 생성 과정 | 단일 | 단계적 |
| 인자 많을 때 | ❌ | ⭕ |
(구조 패턴)
서브시스템이 커질수록:
복잡한 내부 구조를 단순한 인터페이스로 감싼다
Loader.load();
Preprocessor.run();
Model.train();
Evaluator.eval();
learning.run();
(행동 패턴)
상태 변경 시 자동 통지
Subject
├─ register()
├─ remove()
└─ notify()
Observer
└─ update()
→ 다형성 기반 구조
강의·시험·실무 공통
| 비교 | 포인트 |
|---|---|
| Factory vs Builder | 무엇 vs 어떻게 |
| Singleton vs Monostate | 객체 수 |
| Polling vs Observer | 수동 vs 자동 |
| Facade vs 단순 클래스 | 책임 범위 |