디자인 패턴은 소프트웨어 디자인에서 자주 발생하는 문제에 대한 솔루션으로 확립되었습니다. 이를 활용하여 개발자는 코드 가독성, 확장성 및 유지 관리성을 향상시킬 수 있습니다. 이 기사에서는 점점 인기를 얻고 있는 JavaScript의 상위 집합인 TypeScript가 유형 안전성과 최신 기능을 통해 이러한 패턴을 어떻게 개선하는지 살펴봅니다. 대규모 애플리케이션을 개발하든 사이드 프로젝트를 개발하든 TypeScript의 디자인 패턴을 이해하면 개발 기술이 향상됩니다.
디자인 패턴은 소프트웨어 디자인의 일반적인 과제에 대한 재사용 가능한 일반적인 솔루션입니다. 이는 실제 코드가 아니라 이러한 문제를 해결하기 위한 템플릿입니다. GoF(Gang of Four) 책에서 유래한 이 패턴은 세 가지 주요 범주로 나뉩니다.
TypeScript의 기능은 디자인 패턴 구현을 더욱 강력하게 만듭니다.
1. 정적 입력: 컴파일 타임에 오류가 포착되어 런타임 버그가 줄어듭니다.
2. 인터페이스 및 제네릭: 더욱 정확하고 유연한 구현이 가능합니다.
3. 열거형 및 공용체 유형: 상태 관리와 같은 특정 패턴을 단순화합니다.
4. 향상된 도구: IDE 지원을 통해 TypeScript는 생산성을 높입니다.
클래스에 하나의 인스턴스만 있도록 하고 이에 대한 전역 액세스 지점을 제공합니다.
TypeScript로 구현:
class Singleton { private static instance: Singleton; private constructor() {} // Prevent instantiation public static getInstance(): Singleton { if (!Singleton.instance) { Singleton.instance = new Singleton(); } return Singleton.instance; } } const instance1 = Singleton.getInstance(); const instance2 = Singleton.getInstance(); console.log(instance1 === instance2); // true
사용 사례: 구성 설정 또는 데이터베이스 연결 관리
정확한 클래스를 지정하지 않고 객체를 생성할 수 있는 인터페이스를 제공합니다.
구현:
interface Button { render(): void; } class WindowsButton implements Button { render() { console.log("Rendering Windows button"); } } class MacButton implements Button { render() { console.log("Rendering Mac button"); } } class ButtonFactory { static createButton(os: string): Button { if (os === "Windows") return new WindowsButton(); if (os === "Mac") return new MacButton(); throw new Error("Unknown OS"); } } const button = ButtonFactory.createButton("Mac"); button.render(); // Output: Rendering Mac button
사용 사례: 크로스 플랫폼 애플리케이션을 위한 UI 프레임워크.
한 개체의 변경 사항이 모든 종속 항목에 통보되는 일대다 관계를 정의합니다.
구현:
class Subject { private observers: Array<() => void> = []; addObserver(observer: () => void) { this.observers.push(observer); } notifyObservers() { this.observers.forEach(observer => observer()); } } const subject = new Subject(); subject.addObserver(() => console.log("Observer 1 notified!")); subject.addObserver(() => console.log("Observer 2 notified!")); subject.notifyObservers();
사용 사례: Angular 또는 React와 같은 프런트엔드 프레임워크의 반응성.
알고리즘 계열을 정의하고 각각을 캡슐화하여 상호 교환 가능하게 만듭니다.
구현:
interface PaymentStrategy { pay(amount: number): void; } class CreditCardPayment implements PaymentStrategy { pay(amount: number) { console.log(`Paid ${amount} using Credit Card`); } } class PayPalPayment implements PaymentStrategy { pay(amount: number) { console.log(`Paid ${amount} using PayPal`); } } class PaymentContext { constructor(private strategy: PaymentStrategy) {} executePayment(amount: number) { this.strategy.pay(amount); } } const payment = new PaymentContext(new PayPalPayment()); payment.executePayment(100); // Paid 100 using PayPal
사용 사례: 전자상거래 플랫폼의 결제 시스템
객체에 동적으로 새로운 기능을 추가합니다.
구현:
class Singleton { private static instance: Singleton; private constructor() {} // Prevent instantiation public static getInstance(): Singleton { if (!Singleton.instance) { Singleton.instance = new Singleton(); } return Singleton.instance; } } const instance1 = Singleton.getInstance(); const instance2 = Singleton.getInstance(); console.log(instance1 === instance2); // true
사용 사례: 장바구니에 있는 제품에 기능 추가
Pattern | Category | Use Case | Benefit |
---|---|---|---|
Singleton | Creational | Managing global state like configurations | Guarantees single instance |
Factory | Creational | UI components or APIs | Decouples creation logic |
Observer | Behavioral | Event systems in frameworks | Simplifies communication |
Strategy | Behavioral | Algorithm selection in runtime | Enhances flexibility |
Decorator | Structural | Extending class functionality | Adds dynamic capabilities |
사용 사례
패턴으로 리팩토링
Joshua Kerievsky
다음 글에서 만나요! ?
내 개인 웹사이트: https://shafayet.zya.me
위 내용은 JavaScript로 함수형 프로그래밍 활용하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!