02 工厂方法模式

场景

还是以上文中的场景进行举例:每新增一个球类,就需要新建一个相关类,并修改工厂类中的 constructor 方法,把这个新增的类添加进去。
当类越来越多时,可能修改的也就愈加频繁。
这种情况下,我们可以使用工厂方法模式,工厂方法模式在简单工厂模式上进行了一点点改进:解决了新增类时既要写新增的类的代码又要修改工厂函数(类)的问题。

实现

要实现工厂方法模式,我们需要改变一下定义类的方式:将类定义在工厂类的prototype上,在工厂类中创建对象时,用prototype上的类进行创建。

// 工厂类
class BallFactory{
    constructor(type) {
        return new this[type]();
    }
}

// 足球类
BallFactory.prototype.FootBall = class {
    playFootBall(){
        console.log("我是一个愉快的足球")
    }
}

// 篮球类
BallFactory.prototype.BasketBall = class {
    playBasketBall(){
        console.log("我是一个胖胖的篮球")
    }
}

// 高尔夫球
BallFactory.prototype.Golf = class {
    playGolf(){
        console.log("我是一个高贵的高尔夫")
    }
}

// 创建对象
const football = new BallFactory("FootBall")
const backetball = new BallFactory("BasketBall")
const golf = new BallFactory("Golf")

football.playFootBall()
backetball.playBasketBall()
golf.playGolf()

运行结果:

我是一个愉快的足球
我是一个胖胖的篮球
我是一个高贵的高尔夫

分析

上面的代码中,我们将 FootBallBasketBallGolf 三个类添加到了工厂类的 prototype 上,于是工厂类以及其子类就可以访问到这些类了,然后在工厂类的 constructor 中返回相应的对象。
上面的 constructor 也可以这样写:

constructor(type) {
    return new BallFactory.prototype[type]();
}

完。

你可能感兴趣的:(02 工厂方法模式)