场景
还是以上文中的场景进行举例:每新增一个球类,就需要新建一个相关类,并修改工厂类中的 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()
运行结果:
我是一个愉快的足球
我是一个胖胖的篮球
我是一个高贵的高尔夫
分析
上面的代码中,我们将 FootBall
、BasketBall
、Golf
三个类添加到了工厂类的 prototype
上,于是工厂类以及其子类就可以访问到这些类了,然后在工厂类的 constructor
中返回相应的对象。
上面的 constructor
也可以这样写:
constructor(type) {
return new BallFactory.prototype[type]();
}
完。