愿你坚持不懈,努力进步,进阶成自己理想的人

—— 2017.09, 写给3年后的自己

每天一个JavaScript设计模式:工厂方法模式

一、适用场景

简单工厂模式虽然能够解决创建同类对象的问题,但是却存在以下问题:
1)当需要添加新的类时,就需要修改工厂方法,这违背了开闭原则(OCP, 对扩展开放、对源码修改封闭)
2)不适用创建多类对象
于是,工厂方法模式便是为了解决以上问题的另一种创建型模式


二、核心思想

工厂方法模式中,具体对象的创建过程不在工厂方法中进行,而是推迟到子类中进行,如此在添加新的时就无需修改工厂方法,只需要将子类注册进工厂方法的原型对象中即可。
示例:

function Factory(type, options) {
    if (this instance of Factory) {
        return this[type](options)
    }
    return new Factory(type, options)
}
// 具体的创建过程
Factory.prototype.productA = function (options) {
    // 产品A的创建逻辑
}
Factory.prototype.productB = function (options) {
    // 产品B的创建逻辑
}
Factory.prototype.productC = function (options) {
    // 产品C的创建逻辑
}
// ...

所以当我们需要添加新的类时,就只需要挂载在Factory.prototype上即可,无需去修改工厂方法,如此更符合开闭原则
而在使用时,就只需要:

const pdA = new Factory('productA', options)
const pdB = new Factory('productB', options)
// ...