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]();
}

完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,386评论 2 17
  • 简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建...
    justCode_阅读 4,951评论 1 9
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 9,390评论 1 15
  • 设计原则: 要依赖抽象,不要依赖具体类 目录 本文的结构如下: 什么是工厂方法模式 为什么要用该模式 模式的结构 ...
    w1992wishes阅读 5,171评论 0 6
  • 突然想和他们周末去泡温泉,于是就筹备去吧!很多的旅行只是内心的逃离,想抛开早已烂熟于心的工作去嗅一嗅不远处的...
    那片回忆阅读 1,454评论 0 0

友情链接更多精彩内容