资讯专栏INFORMATION COLUMN

JS 工厂模式

zhangke3016 / 1878人阅读

摘要:工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类。实现一个简单的实现,使用如果使用对象属性来实现以下例子中的工厂方法接受在运行时以字符串形式指定的类型,然后创建并返回所请求类型的对象。

1. 简介

工厂模式的目的是为了创建对象,它通常在类或者类的静态方法中实现,具有以下目标:

当创建相似对象时执行重复操作

当编译时不知道具体类型的情况下,为工厂客户提供一个创建对象的接口

与创建型模式类似,工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类。

工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类。该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便创建的时候指定自己的对象类型。

这个模式十分有用,尤其是创建对象的流程赋值的时候,比如依赖于很多设置文件等。并且,你会经常在程序里看到工厂方法,用于让子类类定义需要创建的对象类型。

2. 实现

一个简单的实现,使用IIFE:

var Car = (function () {
    var Car = function (model, year, miles) {
        this.model = model;
        this.year = year;
        this.miles = miles;
    };
    return function (model, year, miles) {
        return new Car(model, year, miles);
    };
})();

var tom = new Car("Tom", 2009, 20000);
var dudu = new Car("Dudu", 2010, 5000);

如果使用对象属性来实现:

var productManager = {};

productManager.createProductA = function() {
    this.prd = "A"
    console.log("Product " + this.prd);
}
productManager.createProductB = function() {
    this.prd = "B"
    console.log("Product " + this.prd);
}

productManager.factory = function(typeType) {
    return new productManager[typeType];
}

productManager.factory("createProductA");    // Product A
productManager.factory("createProductB");    // Product B

以下例子中的工厂方法接受在运行时以字符串形式指定的类型,然后创建并返回所请求类型的对象。

function CarMaker() {}

CarMaker.prototype.drive = function() {
  return `I have ${this.doors} doors!`
}

CarMaker.factory = function(type) {
  const constr = type
  if (typeof CarMaker[constr] !== "function") {
    throw new Error(`${constr} doesnot exist`)
  }
  // 原型继承的方式使得原型继承父类
  if (typeof CarMaker[constr].prototype.drive !== "function") {
    CarMaker[constr].prototype = new CarMaker()
  }
  return new CarMaker[constr]()
}

CarMaker.Compact = function() { this.doors = 4}
CarMaker.Convertible = function() { this.doors = 2}

const corolla = CarMaker.factory("Compact")
corolla.drive()    // "I have 4 doors!"

也可以把实际对象的创建工作放到原型中:

const Factory = function(type, content) {
  return (this instanceof Factory)
      ? new this[type](content)
      : new Factory(type, content)
}

Factory.prototype.Compact = function(content) { this.doors = 4}
Factory.prototype.Convertible = function(content) { this.doors = 2}

Factory.prototype.Compact.prototype.drive = function() {
  return `I have ${this.doors} doors!`
}

const corolla = Factory("Compact")
corolla.drive()    // "I have 4 doors!"
3. 总结

那么什么时候使用工厂模式呢,以下几种情景下工厂模式特别有用:

对象的构建十分复杂

需要依赖具体环境创建不同实例

处理大量具有相同属性的小对象

什么时候不该用工厂模式:
不滥用运用工厂模式,有时候仅仅只是给代码增加了不必要的复杂度,同时使得测试难以运行下去。

本文是系列文章,可以相互参考印证,共同进步~

JS 抽象工厂模式

JS 工厂模式

JS 建造者模式

JS 原型模式

JS 单例模式

JS 回调模式

JS 外观模式

JS 适配器模式

JS 利用高阶函数实现函数缓存(备忘模式)

JS 状态模式

JS 桥接模式

JS 观察者模式

网上的帖子大多深浅不一,甚至有些前后矛盾,在下的文章都是学习过程中的总结,如果发现错误,欢迎留言指出~

参考:
深入理解JavaScript系列(28):设计模式之工厂模式
《JS 模式》
《Javascript 设计模式》 - 张荣铭

PS:欢迎大家关注我的公众号【前端下午茶】,一起加油吧~

另外可以加入「前端下午茶交流群」微信群,长按识别下面二维码即可加我好友,备注加群,我拉你入群~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92104.html

相关文章

  • JS 设计模式 六(工厂模式

    摘要:首先吧之前的代码打包成一个新的设计模式公用代码工厂模式要点工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。适用场景在任何需要生成复杂对象的地方,都可以使用工厂方法模式。 工厂模式 之前讲了接口,封装,继承,单例等,现在就需要应用这些特性来完成一些设计模式了。首先吧之前的代码打包成一个新的JS DesignPattern.js // 设计模式公用代码 exports...

    raoyi 评论0 收藏0
  • 一天一个设计模式JS实现——工厂模式

    摘要:参考文章深入理解三种工厂模式工厂模式,工厂方法模式,抽象工厂模式详解工厂模式是中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 参考文章:深入理解java三种工厂模式工厂模式,工厂方法模式,抽象工厂模式 详解 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的...

    Muninn 评论0 收藏0
  • JS 抽象工厂模式

    摘要:简介抽象工厂模式就是通过类的抽象使得业务适用于一个产品类簇的创建,而不负责某一类产品的实例。通过抽象工厂,就可以创建某个类簇的产品,并且也可以通过来检查产品的类别,也具备该类簇所必备的方法。 0. 简介 抽象工厂模式(Abstract Factory)就是通过类的抽象使得业务适用于一个产品类簇的创建,而不负责某一类产品的实例。 JS中是没有直接的抽象类的,abstract是个保留字,但...

    RiverLi 评论0 收藏0
  • JS 设计模式 七(抽象工厂模式

    摘要:抽象工厂模式抽象工厂是工厂模式的升级版,他用来创建一组相关或者相互依赖的对象。代码抽象工厂模式抽象工厂的优点抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。 抽象工厂模式 抽象工厂是工厂模式的升级版,他用来创建一组相关或者相互依赖的对象。上节学习了工厂模式,类的创建依赖工厂类,程序需要扩展时,我们必须创建新的工厂类。工厂类是用来生产产品的,那我...

    FuisonDesign 评论0 收藏0
  • js常用设计模式实现(二)工厂模式和抽象工厂模式

    摘要:抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。前边的两个都是直接生产实例的,开始以为抽象工厂也是但是后来发现抽象工厂更像是生产工厂,其实抽象工厂其实是实现子类继承父类的方法。 创建型模式 创建型模式是对一个类的实例化过程进行了抽象,把对象的创建和对象的使用进行了分离 上一篇介绍了下单例模式,这一篇介绍一下工厂模式和抽象工厂模式,...

    meteor199 评论0 收藏0

发表评论

0条评论

zhangke3016

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<