定义:定义一个创建对象的接口,但由子类决定实例化哪一个类
类比:一家饮料工厂可以生产不同口味的饮料,橙汁、可乐、柠檬水等,但工厂的生产线是一样的。不同口味由具体的生产方法决定
应用场景
- 在代码中指定实现类时机不明确,或者想要在运行时动态决定具体实现
- 客户端不需要知道所创建对象的具体类
优缺点
- 优点:
- 提供一种创建对象的更灵活的方式
- 客户端无需知道所创建对象的具体类,符合开闭原则
- 缺点:
- 增加代码复杂性,增加了系统中类的数量
实现代码
interface Product {
operation(): string;
}
class ConcreteProductA implements Product {
public operation(): string {
return 'Result of ConcreteProductA';
}
}
class ConcreteProductB implements Product {
public operation(): string {
return 'Result of ConcreteProductB';
}
}
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()}`;
}
}
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());
clientCode(new ConcreteCreatorB());