【吃透】JS设计模式 · 工厂模式

工厂模式

概念

工厂模式不暴露创建对象的具体逻辑,而是将逻辑封装在一个函数中,创建大量相似对象,那么这个函数就可以被视为一个工厂。工厂模式根据抽象程度的不同可以分为:简单工厂工厂方法抽象工厂

优点

通过工厂模式,我们可以快速创建大量相似对象,没有重复代码。

缺点

工厂模式创建的对象属于Object,无法区分对象类型,这也是工厂模式没有广泛使用的原因。

代码实现

简单工厂模式(静态):

// 例:将王者英雄进行按需分类,在一个公共的工厂中产出
const personList = [
        {
            person: ['妲己', '小乔', '周瑜', '王昭君']
        },
        {
            person: ['李白', '阿珂', '兰陵王', '韩跳跳']
        },
        {
            person: ['曹阿瞒', '凯爹', '宫本']
        }
    ]
let wangzhe = function (personType) {
    
    function Fashi() {
      this.person = personList[0].person
    }
    function Cike() {
      this.person =  personList[1].person
    }
    function Zhanshi() {
      this.person =  personList[2].person
    }
  
    switch (personType) {
      case 'fashi': return new Fashi(); break;
      case 'cike': return new Cike(); break;
      case 'zhanshi': return new Zhanshi(); break;
      default: throw new Error('参数错误, 可选参数:fashi、cike、zhanshi');
    }
  }
  
  //调用
  let fashi = wangzhe('fashi');
  let cike = wangzhe('cike');
  let zhanshi = wangzhe('zhanshi');
  fashi.peson // ['妲己', '小乔', '周瑜', '王昭君']
  
 // es6写法:
  class Wangzhe {
    constructor(opt) {
        this.person = opt.person;
    }

  static getPersonList(personType) {
  switch (personType) {
   case 'fashi': return new Wangzhe(personList[0]); break;
   case 'cike': return new Wangzhe(personList[1]); break;
   case 'zhanshi': return new Wangzhe(personList[2]); break;
   default: throw new Error('参数错误, 可选参数:fashi、cike、zhanshi');
 }
}
}
//调用
Wangzhe.getPersonList('fashi').person // ['妲己', '小乔', '周瑜', '王昭君']

你可能感兴趣的:(【吃透】JS设计模式 · 工厂模式)