单例模式与工厂模式

在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

应用场景

  1. 配置管理:全局配置对象
  2. 日志记录:集中式日志系统
  3. 数据库连接:共享数据库连接池
  4. 缓存系统:全局缓存访问

工厂模式

概念与分类

工厂模式提供了一种创建对象的接口,但允许子类决定实例化哪个类。它主要分为:

  1. 简单工厂:一个工厂类根据条件创建不同产品
  2. 工厂方法:将实例化推迟到子类
  3. 抽象工厂:创建相关或依赖对象的家族

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

应用场景

  1. UI组件:根据不同平台创建相应风格的UI控件
  2. 支付系统:根据支付方式创建不同的支付处理器
  3. 日志系统:根据环境创建文件日志或控制台日志
  4. 数据库访问:为不同数据库提供统一的接口

模式对比与选择

特性 单例模式 工厂模式
目的 控制实例数量 封装对象创建过程
关注点 对象生命周期管理 对象创建逻辑抽象
灵活性 较低(单一实例) 较高(可扩展产品系列)
适用场景 全局共享资源 复杂对象创建过程

选择建议

  • 当需要确保系统中只有一个实例时,使用单例模式
  • 当对象创建逻辑复杂或需要灵活扩展时,使用工厂模式
  • 两者可以结合使用,例如在工厂中使用单例产品

TypeScript中的最佳实践

  1. 利用接口:定义清晰的契约,提高代码可维护性
  2. 访问修饰符:合理使用private/protected控制访问
  3. 静态成员:在单例模式中有效管理实例
  4. 类型安全:利用TypeScript的类型系统确保模式正确实现
  5. 依赖注入:考虑将单例作为依赖注入,提高可测试性

结论

单例模式和工厂模式是TypeScript面向对象编程中强大的工具。单例模式确保资源的唯一性和集中管理,而工厂模式提供了灵活的对象创建机制。理解它们的原理和适用场景,能够帮助开发者设计出更清晰、更可维护的TypeScript应用程序。在实际项目中,根据具体需求合理选择和组合这些模式,可以显著提高代码质量和开发效率。