工厂模式:创建型设计模式解析

工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需指定具体的类。工厂模式的核心思想是将对象的创建过程封装起来,使得客户端代码与具体类的实例化过程解耦。工厂模式通常分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。
1. 简单工厂模式
简单工厂模式是最基础的工厂模式,它通过一个工厂类来创建不同类型的对象。客户端只需要知道工厂类,而不需要知道具体的产品类。
应用场景:
- 当对象的创建逻辑相对简单,且不需要频繁扩展时。
- 当客户端不需要知道具体产品的类名,只需要知道工厂类即可。
class ProductA {
use() {
console.log('Using Product A');
}
}
class ProductB {
use() {
console.log('Using Product B');
}
}
class SimpleFactory {
createProduct(type) {
switch (type) {
case 'A':
return new ProductA();
case 'B':
return new ProductB();
default:
throw new Error('Unknown product type');
}
}
}
const factory = new SimpleFactory();
const productA = factory.createProduct('A');
productA.use(); // Output: Using Product A
2. 工厂方法模式
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让类的实例化推迟到子类。
应用场景:
- 当对象的创建逻辑较为复杂,且需要根据不同的条件创建不同的对象时。
- 当系统需要支持扩展,且不希望修改现有代码时。
class Product {
use() {
throw new Error('Abstract method!');
}
}
class ProductA extends Product {
use() {
console.log('Using Product A');
}
}
class ProductB extends Product {
use() {
console.log('Using Product B');
}
}
class Factory {
createProduct() {
throw new Error('Abstract method!');
}
}
class FactoryA extends Factory {
createProduct() {
return new ProductA();
}
}
class FactoryB extends Factory {
createProduct() {
return new ProductB();
}
}
const factoryA = new FactoryA();
const productA = factoryA.createProduct();
productA.use(); // Output: Using Product A
3. 抽象工厂模式
抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式通常用于创建一组相关的产品。
应用场景:
- 当系统需要创建一组相关的产品,且这些产品之间有依赖关系时。
- 当系统需要支持多种产品族,且不希望客户端代码与具体产品类耦合时。
class ProductA1 {
use() {
console.log('Using Product A1');
}
}
class ProductA2 {
use() {
console.log('Using Product A2');
}
}
class ProductB1 {
use() {
console.log('Using Product B1');
}
}
class ProductB2 {
use() {
console.log('Using Product B2');
}
}
class AbstractFactory {
createProductA() {
throw new Error('Abstract method!');
}
createProductB() {
throw new Error('Abstract method!');
}
}
class ConcreteFactory1 extends AbstractFactory {
createProductA() {
return new ProductA1();
}
createProductB() {
return new ProductB1();
}
}
class ConcreteFactory2 extends AbstractFactory {
createProductA() {
return new ProductA2();
}
createProductB() {
return new ProductB2();
}
}
const factory1 = new ConcreteFactory1();
const productA1 = factory1.createProductA();
const productB1 = factory1.createProductB();
productA1.use(); // Output: Using Product A1
productB1.use(); // Output: Using Product B1
总结
工厂模式的核心优势在于它将对象的创建过程与使用过程分离,使得系统更加灵活、可扩展。简单工厂模式适用于简单的场景,工厂方法模式适用于需要扩展的场景,而抽象工厂模式适用于需要创建一组相关产品的场景。在实际开发中,应根据具体需求选择合适的工厂模式。