设计模式之创建型设计模式——工厂方法模式
工厂方法模式
现实生活中的例子:
考虑招聘经理的情况。一个人不可能对每个职位进行面试。根据职位空缺,她必须决定并将面试步骤委托给不同的人。
通俗解释:
它提供了一种将实例化逻辑委托给子类的方法。
维基百科:
在基于类的编程中,工厂方法模式是一种创建模式,它使用工厂方法来处理创建对象的问题,而无需指定将要创建的对象的确切类。这是通过调用工厂方法来创建对象来完成的 - 在接口中指定并由子类实现,或者在基类中实现并可选地由派生类覆盖 - 而不是通过调用构造函数。
程序示例:
以上面的招聘经理为例。首先,我们有一个访谈者界面和一些实现
// 访谈者界面和一些实现
class Interviewer { //接口
constructor() {
if(new.target === Interviewer) {
throw new Error('接口不能实例化');
}
}
askQuestions() {
this.askQuestion()
}
}
class Developer extends Interviewer {
askQuestion() {
console.log('Asking about design patterns!');
}
}
class CommunityExecutive extends Interviewer {
askQuestion() {
console.log('Asking about community building!');
}
}
现在让我们创造我们的 HiringManager
// 面试官抽象类
class HiringManager {
constructor() {
if(new.target === HiringManager) {
throw new Error('抽象类不能被实例化');
}
}
takeInterview() {
let interviewer = this.makeInterviewer();
interviewer.askQuestions();
}
}
现在任何子类都可以继承并提供所需的Interviewer
// 面试官
class DevelopmentManager extends HiringManager {
makeInterviewer() {
return new Developer();
}
}
class MarketingManager extends HiringManager {
makeInterviewer() {
return new CommunityExecutive();
}
}
然后就可以这样使用。
// 使用
let devManager = new DevelopmentManager();
devManager.takeInterview(); // Output: Asking about design patterns
let marketingManager = new MarketingManager();
marketingManager.takeInterview(); // Output: Asking about community building.
什么时候使用?
在类中有一些通用处理但在运行时动态决定所需的子类时很有用。换句话说,当客户端不知道它可能需要什么样的子类时。