设计模式之创建型设计模式——工厂方法模式

工厂方法模式

现实生活中的例子:

考虑招聘经理的情况。一个人不可能对每个职位进行面试。根据职位空缺,她必须决定并将面试步骤委托给不同的人。

通俗解释:

它提供了一种将实例化逻辑委托给子类的方法。

维基百科:

在基于类的编程中,工厂方法模式是一种创建模式,它使用工厂方法来处理创建对象的问题,而无需指定将要创建的对象的确切类。这是通过调用工厂方法来创建对象来完成的 - 在接口中指定并由子类实现,或者在基类中实现并可选地由派生类覆盖 - 而不是通过调用构造函数。

程序示例:

以上面的招聘经理为例。首先,我们有一个访谈者界面和一些实现

// 访谈者界面和一些实现
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.

什么时候使用?

在类中有一些通用处理但在运行时动态决定所需的子类时很有用。换句话说,当客户端不知道它可能需要什么样的子类时。