设计模式-工厂方法模式

32 阅读1分钟

定义

工厂方法模式是一种创建型模式,它定义了一个接口用于创建对象,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化延迟到子类中进行。

UML 图

typescript 实现

1. 定义产品接口

interface Product {
    operation(): string;
}

2. 创建具体产品类

class ConcreteProduct1 implements Product {
    operation(): string {
        return 'Result of the ConcreteProduct1';
    }
}

class ConcreteProduct2 implements Product {
    operation(): string {
        return 'Result of the ConcreteProduct2';
    }
}

3. 定义创建者类

abstract class Creator {
    public abstract factoryMethod(): Product;

    public someOperation(): string {
        // 调用工厂方法创建一个产品对象
        const product = this.factoryMethod();
        // 使用产品
        return `Creator: The same creator's code has just worked with ${product.operation()}`;
    }
}

4. 创建具体创建者类

class ConcreteCreator1 extends Creator {
    public factoryMethod(): Product {
        return new ConcreteProduct1();
    }
}

class ConcreteCreator2 extends Creator {
    public factoryMethod(): Product {
        return new ConcreteProduct2();
    }
}

5. 使用示例

function clientCode(creator: Creator) {
    console.log('Client: I\'m not aware of the creator\'s class, but it still works.');
    console.log(creator.someOperation());
}

console.log('App: Launched with the ConcreteCreator1.');
clientCode(new ConcreteCreator1());
console.log('');

console.log('App: Launched with the ConcreteCreator2.');
clientCode(new ConcreteCreator2());

通用的工厂方法

# 公共部分,抽象的创建者
export abstract class Creator<T> {
  public abstract factoryMethod(): T;
  public create(): T {
    return this.factoryMethod();
  }
}

# 非公共部分
interface Fruit {
  eat(): void;
}

class Apple implements Fruit {
  eat() {
    console.log("Eating Apple");
  }
}

class AppleCreator extends Creator<Fruit> {
  factoryMethod() {
    return new Apple();
  }
}

const apple = new AppleCreator().factoryMethod();