美文网首页JavaScript
02 工厂方法模式

02 工厂方法模式

作者: 柏丘君 | 来源:发表于2017-08-08 16:41 被阅读8次

    场景

    还是以上文中的场景进行举例:每新增一个球类,就需要新建一个相关类,并修改工厂类中的 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 工厂方法模式

        本文链接:https://www.haomeiwen.com/subject/asotrxtx.html