디자인 패턴은 소프트웨어 개발에서 반복적으로 발생하는 문제에 대해 일반적이고 재사용 가능한 해결책을 제공하는 설계 원칙들의 모음입니다. 이 디자인 패턴은 보다 구조적이고 유지보수 가능한 코드를 작성하는 데 도움이 됩니다. 디자인 패턴은 크게 생성(Creational), 구조(Structural), 행위(Behavioral) 패턴으로 분류됩니다.
👉생성, 구조, 행위 디자인패턴 예시로 이해하기
0. 디자인패턴의 종류
생성패턴(Creational Patterns), 구조패턴(Structural Patterns), 행위패턴(Behavioral Patterns)
- 생성패턴 - 팩토리 메서드 패턴, 추상 팩토리 패턴, 빌더 패턴, 싱글톤 패턴, 프로토타입 패턴
- 구조 패턴 - 어댑터 패턴, 데코레이터 패턴, 컴퍼지트 패턴, 퍼사드 패턴, 프록시 패턴, 브리지 패턴, 플라이웨이트 패턴
- 행위 패턴 - 옵저버 패턴, 전략 패턴, 템플릿 메서드 패턴, 인터프리터 패턴, 커맨드 패턴, 스테이트 패턴, 체인오브리스폰서 패턴, 미디에이터 패턴, 메멘토 패턴, 비지터 패턴
1. 디자인패턴 - 생성
생성 패턴 (Creational Patterns): 생성 패턴은 객체의 인스턴스화를 다루는 패턴으로, 객체의 생성 방식과 관련된 문제를 해결하는 데 사용됩니다. 대표적인 생성 패턴은 '싱글톤 패턴'입니다.
- 싱글톤패턴 (Singleton Pattern) : 특정 클래스의 인스턴스가 오직 하나만 생성되도록 보장하는 패턴입니다.
- 실제 적용 예시 : 데이터베이스 연결, 애플리케이션 상태관리(환경설정)
- 장, 단점 : 전역공유해야하는 서비스에 유용하지만 객체의 의존성에 영향을 줍니다.
class Singleton {
constructor() {
if (Singleton.instance) {
return console.warn('Warning: Singleton class already instantiated');
}
Singleton.instance = this;
this.version = Date.now();
this.config = 'test';
}
static getInstance() {
if (!this.instance) {
this.instance = new Singleton();
}
return this.instance;
}
}
// const a = new Singleton();
// console.log(a);
// const b = new Singleton();
// console.log(b);
// console.log(a === b); // true
// console.log(a, b);
const a1 = Singleton.getInstance();
const b1 = Singleton.getInstance();
console.log(a1, b1);
console.log(a1 === b1);
2. 디자인패턴 - 구조
구조 패턴(Structural Patterns)은 클래스와 객체들을 조합하여 더 큰 구조를 형성하는 문제를 해결하기 위해 사용됩니다. 대표적인 구조 패턴은 '퍼사드 패턴' 입니다.
- 퍼사드 패턴(Facade Pattern) : 복잡한 서브시스템을 단순한 인터페이스로 감싸서 사용하기 쉽도록 만드는 패턴입니다.
- 실제 적용 예시 : 복잡한 시스템의 인터페이스 간소화
- 장, 단점 : 단순한 인터페이스를 제공할 수 있으나 추가비용이 발생하고 복잡성이 증가할 수 있다.
이해하기 쉽게 파일을 파일을 가공하는 과정을 퍼사드로 만들어본다면 아래와 같다.
클라이언트가 단순히 파일을 다운로드 받고싶은 상황이라고 가정할때, 우리는 파일을 가공하는 과정인 다운로드, 파일 처리 2가지의 서브시스템을 하나의 퍼사드 operation으로 만들어 줄 수 있다.
// 서브시스템
function FileDownloader() {
this.downloadFile = function (url) {
console.log('Downloading file from:', url);
// 파일 다운로드 로직
};
}
function FileProcessor() {
this.processFile = function (file) {
console.log('Processing file:', file);
// 파일 처리 로직
};
}
// 퍼사드
function FileDownloaderFacade() {
this.downloader = new FileDownloader();
this.processor = new FileProcessor();
this.downloadAndProcessFile = function (url) {
this.downloader.downloadFile(url);
this.processor.processFile(url);
};
}
// 클라이언트
var fileDownloaderFacade = new FileDownloaderFacade();
fileDownloaderFacade.downloadAndProcessFile('https://example.com/file.txt');
//Downloading file from: https://example.com/file.txt
//Processing file: https://example.com/file.txt
3. 디자인패턴 - 행위
행위 패턴 (Behavioral Patterns): 행위 패턴은 객체 간의 책임 분배와 알고리즘의 분리에 관련된 패턴으로, 객체들 간의 상호작용을 정의하는 데 사용됩니다. 대표적인 행위 패턴은 '옵저버 패턴'입니다.
- 옵저버 패턴 (Observer Pattern): 주체가 어떤 객체의 상태변화를 관찰하다가 상태 변화가 있을때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 패턴
- 실제 적용 예시 : 트위터
- 장, 단점 : 단순한 인터페이스를 제공할 수 있으나 추가비용이 발생하고 복잡성이 증가할 수 있다.
4. 기술면접대비
Q: 디자인 패턴이란 무엇이며 몇가지 예시를 들어줄 수 있나요?
A: 디자인 패턴이란 어떤 문제에 대한 해결 방법을 탬플릿으로 만들어 놓은것을 의미합니다. 디자인 패턴은 생성, 구조, 동작 패턴으로 분류됩니다. 대표적인 디자인 패턴에는 싱글톤, 전략, 옵저버 패턴 등이 있습니다.
-> 싱글톤 패턴이란 오직 하나의 인스턴스만을 생성하여 그 인스턴스에 대한 전역적인 접근을 제공하는 디자인 패턴 입니다. 전략 패턴이란 런타임에 알고리즘을 선택할 수 있도록 도와주는 패턴입니다. 마지막으로 옵저버 패턴은 한 객체의 상태변화가 다른 객체에게 통보되도록 종속성을 정의하는 패턴 입니다. 한 주체의 상태가 변경되면 그 객체에 의존하는 다른 객체들에게 자동으로 알림을 보내는 메커니즘을 제공합니다.
이와 같이 디자인 패턴은 소프트웨어 설계에서 자주 사용되며, 각각의 경우에 따라 적합한 패턴을 선택하여 보다 효율적이고 유지보수 가능한 코드를 구현할 수 있습니다.
추천글
2023.05.10 - [필수 개발지식/디자인패턴] - [Design Pattern] 빌더패턴 (Builder)
2023.05.23 - [필수 개발지식/디자인패턴] - [Design Pattern] 전략 패턴 (Strategy)
'필수 개발지식 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] 프록시패턴과 프록시서버 (0) | 2023.08.10 |
---|---|
[Design Pattern] 전략 패턴 (Strategy) (1) | 2023.05.23 |
[Design Pattern] 메멘토 패턴 (Memento) (0) | 2023.05.15 |
[Design Pattern] 퍼사드 패턴 (Facade) (0) | 2023.05.12 |
[Design Pattern] 빌더패턴 (Builder) (0) | 2023.05.10 |