TypeScript 设计模式详解
设计模式是软件开发中常用的解决方案,其本质在于总结行业经验,以便更高效地处理常见问题。在本文中,我们将讨论一些在 TypeScript 中实现的设计模式,并通过代码示例进行说明。同时,我们还将展示类图和关系图,以更好地理解这些模式。
1. 单例模式(Singleton Pattern)
单例模式确保一个类只有一个实例,并提供全局访问点。这个模式适合在需要控制资源的访问时使用,比如数据库连接。
代码示例
class Singleton {
private static instance: Singleton;
private constructor() {
// 私有构造函数
}
public static getInstance(): Singleton {
if (!this.instance) {
this.instance = new Singleton();
}
return this.instance;
}
public sayHello() {
console.log("Hello, Singleton");
}
}
// 使用示例
const singleton1 = Singleton.getInstance();
const singleton2 = Singleton.getInstance();
singleton1.sayHello(); // Hello, Singleton
console.log(singleton1 === singleton2); // true
类图
classDiagram
class Singleton {
+getInstance(): Singleton
+sayHello(): void
}
2. 工厂模式(Factory Pattern)
工厂模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。这种模式可以将对象的创建推迟到子类中。
代码示例
interface Product {
operation(): string;
}
class ConcreteProductA implements Product {
public operation(): string {
return "结果: 产品A";
}
}
class ConcreteProductB implements Product {
public operation(): string {
return "结果: 产品B";
}
}
class Creator {
public static createProduct(type: string): Product {
if (type === "A") {
return new ConcreteProductA();
} else if (type === "B") {
return new ConcreteProductB();
}
throw new Error("Unknown product type");
}
}
// 使用示例
const productA = Creator.createProduct("A");
console.log(productA.operation()); // 结果: 产品A
const productB = Creator.createProduct("B");
console.log(productB.operation()); // 结果: 产品B
类图
classDiagram
class Product {
+operation(): string
}
class ConcreteProductA {
+operation(): string
}
class ConcreteProductB {
+operation(): string
}
class Creator {
+createProduct(type: string): Product
}
Product <|-- ConcreteProductA
Product <|-- ConcreteProductB
3. 观察者模式(Observer Pattern)
观察者模式定义了对象间的一对多关系,确保当一个对象的状态发生变化时,所有依赖于它的对象都能得到通知。
代码示例
class Subject {
private observers: Observer[] = [];
public attach(observer: Observer) {
this.observers.push(observer);
}
public notify() {
this.observers.forEach(observer => observer.update());
}
}
interface Observer {
update(): void;
}
class ConcreteObserver implements Observer {
private name: string;
constructor(name: string) {
this.name = name;
}
public update(): void {
console.log(`${this.name} 收到了更新通知!`);
}
}
// 使用示例
const subject = new Subject();
const observer1 = new ConcreteObserver("观察者1");
const observer2 = new ConcreteObserver("观察者2");
subject.attach(observer1);
subject.attach(observer2);
subject.notify(); // 观察者1 收到了更新通知!
// 观察者2 收到了更新通知!
类图
classDiagram
class Subject {
+attach(observer: Observer): void
+notify(): void
}
class Observer {
+update(): void
}
class ConcreteObserver {
+update(): void
}
Subject --> Observer
Observer <|-- ConcreteObserver
4. 关系图
反映了对象之间的关系,如依赖、关联等。
erDiagram
SUBJECT ||--o{ OBSERVER : notifies
OBSERVER }o--|| CONCRETE_OBSERVER : implements
总结
设计模式为我们提供了一套通用的、可复用的解决方案。在 TypeScript 中实现这些设计模式,可以使我们的代码更加清晰、易于维护。通过本文中讨论的单例模式、工厂模式和观察者模式,并通过类图和关系图的展示,希望能够帮助您更好地理解和应用这些设计模式。在项目开发中,根据具体需求选择合适的设计模式,将会大大提高代码的质量和可读性。