工厂模式分为 简单工厂模式,工厂方法模式,抽象工厂模式
简单工厂模式
简单工厂模式又叫静态工厂模式,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。
// 简单工厂模式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('微博小李');