前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >javascript设计模式-简单工厂模式

javascript设计模式-简单工厂模式

作者头像
FE情报局
发布2022-12-05 10:25:51
1890
发布2022-12-05 10:25:51
举报
文章被收录于专栏:FE情报局FE情报局

简单工厂模式,又被称为静态工厂方法。通过一个工厂对象来创建某一种产品对象的实例,主要是用来创建同一种类型的对象 简单来说就是通过一个方法决定到底要创建那个类的实例 我们用水果来举例

那代码如何写呢? 首先,我们需要创建一系列水果的抽象产品

类实例化工厂函数

代码语言:javascript
复制
// 创建苹果类
class Apple {
  constructor(){
    this.name = 'apple'
  }
  getColor(){
    return 'Red'
  }
}

// 创建香蕉类
class Banana {
  constructor(name){
    this.name = 'banana'
    this.count = 10
  }
  getCount(){
    return this.count--
  }
}


创建了很多水果类,每个水果类可以实现自己的一系列逻辑,而具体的到底要用哪个类名创建你想要的水果你是不需要关心的,所以我们需要一个工厂,用来生产这些水果实体,那如何生产呢? 定义一个Fruits工厂类

代码语言:javascript
复制
class Fruits {
  constructor(type){
    switch(type){
      case 'apple':
        return new Apple()
      case 'banana':
        return new Banana()
    }
  }
}

我们在使用的时候只需要new Fruits,传入你想实例化的内容,就能够得到相应的水果实体

代码语言:javascript
复制
const apple = new Fruits('apple')
// apple.name => apple
// apple.getColor() => Red
const banana = new Fruits('banana')
// banana.name => banana
// banana.getCount => 10

这样提供给别人的时候就不需要那么多的累,他们只要知道Fruits和type就能得到自己想要的结果 看到这里可能就有同学会说了,上面创建各种水果类的时候,很多地方是相同的,相同的部分也是可以提取出来的,简单工厂模式最主要的理念就是创建对象,创建一个水果可能有很多相同的部分,当然还有一部分不同的部分,我们也可以创建一个公共的创建水果类的方法 于是就有了以下代码

创建新对象形式

代码语言:javascript
复制
class creatFruit{
  constructor(name, color, count){
    this.name = name
    this.color = color
    this.count = count
  }
  getColorName(){
    return this.color + this.name
  }
}

// 你也可以
const creatFruit = ({name, color, count}) => ({
  name,
  color,
  count,
  getColorName() {
    return this.color + this.name
  }
})

你会发现其实创建水果类也可以使用工厂模式,最终创建水果可以这样写

代码语言:javascript
复制
const apple = new creatFruit('apple', 'red', 10)
const banana = new creatFruit('banana', 'yellow', 20)
// apple.getColorName() => redapple
// banana.getColorName() => yellowbanana
// 或者可以这样
const apple = creatFruit({name: 'apple', color: 'red', count:10})
// apple.getColorName() => redapple

使用这种方式,我们还可以将数组转换为键值对象

代码语言:javascript
复制
const createObjectFromArray = ([key, value]) => ({
  [key]: value
});
// createObjectFromArray(['name', 'FE情报局']) => {name: 'FE情报局'}

总结

上面其实给到了大家两种使用工厂函数的方式,第一种是通过类实例化的方式进行的创建。第二种是通过扩展对象的形式,用函数返回一个新的对象的形式。 第一种的好处是,如果这些类来自同一个父类,那其中父类原型上的方法是可以共用的 但是第二种由于是通过函数返回了一个新的对象,其方法不具有共用性

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FE情报局 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 类实例化工厂函数
  • 创建新对象形式
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档