设计模式---工厂模式

73 阅读2分钟

工厂模式分为 简单工厂模式,工厂方法模式,抽象工厂模式


简单工厂模式

简单工厂模式又叫静态工厂模式,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。

// 简单工厂模式class User {    constructor(name, viewPage) {        this.name = name;        this.viewPage = viewPage    }    static getRole(role) {        switch (role) {            case 'superAdmin':                return new User({                    name: '超级管理员',                    viewPage: ['首页', '通讯录', '发现页', '应用数据', '权限管理']                });                break;            case 'admin':                return new User({                    name: '管理员',                    viewPage: ['首页', '通讯录', '发现页', '应用数据']                });                break;            case 'user':                return new User({                    name: '普通用户',                    viewPage: ['首页', '通讯录', '发现页']                });                break;            default:                throw new Error('参数错误, 可选参数:superAdmin、admin、user')        }    }}//调用let superAdmin = User.getInstance('superAdmin');let admin = User.getInstance('admin');let normalUser = User.getInstance('user');

工厂方法模式

工厂方法模式的本意是将实际创建对象的工作推迟到子类中,这样核心类就变成了抽象类。

class User {    constructor(name, age) {        // 不能实例User类 它的方法需要子类去实现 模拟abstrct        // new.target 指向被new实例化的构造函数        if (new.target === User) {            throw new Error('抽象类不能实例化!');        }        this.name = name;        this.age = age    }}class UserFactory extends User {    constructor(name, age) {        super(name, age)    }    create(role) {        switch (role) {            case 'superAdmin':                return new UserFactory('超级管理员', ['首页', '通讯录', '发现页', '应用数据', '权限管理']);                break;            case 'admin':                return new UserFactory('普通用户', ['首页', '通讯录', '发现页']);                break;            case 'user':                return new UserFactory('普通用户', ['首页', '通讯录', '发现页']);                break;            default:                throw new Error('参数错误, 可选参数:superAdmin、admin、user')        }    }}let userFactory = new UserFactory();let superAdmin = userFactory.create('superAdmin');let admin = userFactory.create('admin');let user = userFactory.create('user');

class User {
  constructor(type) {
    if (new.target === User) {
      throw new Error('抽象类不能实例化!')
    }
    this.type = type;
  }
}

class UserOfWechat extends User {
  constructor(name) {
    super('wechat');
    this.name = name;
    this.viewPage = ['首页', '通讯录', '发现页']
  }
}

class UserOfQq extends User {
  constructor(name) {
    super('qq');
    this.name = name;
    this.viewPage = ['首页', '通讯录', '发现页']
  }
}

class UserOfWeibo extends User {
  constructor(name) {
    super('weibo');
    this.name = name;
    this.viewPage = ['首页', '通讯录', '发现页']
  }
}

function getAbstractUserFactory(type) {
  switch (type) {
    case 'wechat':
      return UserOfWechat;
      break;
    case 'qq':
      return UserOfQq;
      break;
    case 'weibo':
      return UserOfWeibo;
      break;
    default:
      throw new Error('参数错误, 可选参数:superAdmin、admin、user')
  }
}

let WechatUserClass = getAbstractUserFactory('wechat');
let QqUserClass = getAbstractUserFactory('qq');
let WeiboUserClass = getAbstractUserFactory('weibo');

let wechatUser = new WechatUserClass('微信小李');
let qqUser = new QqUserClass('QQ小李');
let weiboUser = new WeiboUserClass('微博小李');