在TypeScript与面向对象编程(OOP)的世界中,设计模式是解决常见问题的优雅方案。单例模式和工厂模式是两种最常用且实用的创建型模式,它们帮助我们以更结构化和可维护的方式组织代码。本文将深入探讨这两种模式在TypeScript中的实现和应用。
单例模式
概念与特点
单例模式确保一个类只有一个实例,并提供一个全局访问点。这在需要控制资源访问或共享状态的场景中特别有用。
主要特点:
- 私有构造函数防止外部实例化
- 静态方法或属性提供全局访问点
- 延迟初始化(首次使用时创建)
TypeScript实现
typescript
class Singleton {
private static instance: Singleton;
private constructor() {
// 初始化代码
}
public static getInstance(): Singleton {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
public someBusinessLogic() {
// 业务逻辑
}
}
// 使用
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // 输出: true
应用场景
- 配置管理:全局配置对象
- 日志记录:集中式日志系统
- 数据库连接:共享数据库连接池
- 缓存系统:全局缓存访问
工厂模式
概念与分类
工厂模式提供了一种创建对象的接口,但允许子类决定实例化哪个类。它主要分为:
- 简单工厂:一个工厂类根据条件创建不同产品
- 工厂方法:将实例化推迟到子类
- 抽象工厂:创建相关或依赖对象的家族
TypeScript实现(工厂方法示例)
typescript
interface Product {
operation(): string;
}
class ConcreteProductA implements Product {
operation(): string {
return 'ConcreteProductA operation';
}
}
class ConcreteProductB implements Product {
operation(): string {
return 'ConcreteProductB operation';
}
}
abstract class Creator {
public abstract factoryMethod(): Product;
public someOperation(): string {
const product = this.factoryMethod();
return `Creator: ${product.operation()}`;
}
}
class ConcreteCreatorA extends Creator {
public factoryMethod(): Product {
return new ConcreteProductA();
}
}
class ConcreteCreatorB extends Creator {
public factoryMethod(): Product {
return new ConcreteProductB();
}
}
// 使用
function clientCode(creator: Creator) {
console.log(creator.someOperation());
}
clientCode(new ConcreteCreatorA()); // 输出: Creator: ConcreteProductA operation
clientCode(new ConcreteCreatorB()); // 输出: Creator: ConcreteProductB operation
应用场景
- UI组件:根据不同平台创建相应风格的UI控件
- 支付系统:根据支付方式创建不同的支付处理器
- 日志系统:根据环境创建文件日志或控制台日志
- 数据库访问:为不同数据库提供统一的接口
模式对比与选择
特性 | 单例模式 | 工厂模式 |
---|---|---|
目的 | 控制实例数量 | 封装对象创建过程 |
关注点 | 对象生命周期管理 | 对象创建逻辑抽象 |
灵活性 | 较低(单一实例) | 较高(可扩展产品系列) |
适用场景 | 全局共享资源 | 复杂对象创建过程 |
选择建议:
- 当需要确保系统中只有一个实例时,使用单例模式
- 当对象创建逻辑复杂或需要灵活扩展时,使用工厂模式
- 两者可以结合使用,例如在工厂中使用单例产品
TypeScript中的最佳实践
- 利用接口:定义清晰的契约,提高代码可维护性
- 访问修饰符:合理使用private/protected控制访问
- 静态成员:在单例模式中有效管理实例
- 类型安全:利用TypeScript的类型系统确保模式正确实现
- 依赖注入:考虑将单例作为依赖注入,提高可测试性
结论
单例模式和工厂模式是TypeScript面向对象编程中强大的工具。单例模式确保资源的唯一性和集中管理,而工厂模式提供了灵活的对象创建机制。理解它们的原理和适用场景,能够帮助开发者设计出更清晰、更可维护的TypeScript应用程序。在实际项目中,根据具体需求合理选择和组合这些模式,可以显著提高代码质量和开发效率。