定义
工厂方法模式是一种创建型模式,它定义了一个接口用于创建对象,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化延迟到子类中进行。
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();