工厂模式
js
function User(role, pages) {
this.role = role;
this.pages = pages;
}
// new User('admin', ['home', 'user', 'setting']);
// new User('user', ['home', 'user']);
// new User('guest', ['home']);
function UserFactory(role) {
switch (role) {
case 'admin':
return new User(role, ['home', 'user', 'setting']);
break;
case 'user':
return new User(role, ['home', 'user']);
break;
case 'guest':
return new User(role, ['home']);
break;
default:
throw new Error('未知角色')
}
}
es6 的写法:
js
class User {
constructor(role, pages) {
this.role = role;
this.pages = pages;
}
static getInstance(role) {
switch (role) {
case 'admin':
return new User(role, ['home', 'user', 'setting']);
break;
case 'user':
return new User(role, ['home', 'user']);
break;
case 'guest':
return new User(role, ['home']);
break;
default:
throw new Error('未知角色')
}
}
}
User.getInstance('admin'); // {role: 'admin', pages: ['home', 'user', 'setting']}
简单工厂的优点在于,你只需要一个正确的参数,就可以获取到你所需要的对象,而无需知道其创建的具体细节。
但是在函数内包含了所有对象的创建逻辑和判断逻辑的代码,每增加新的构造函数还需要修改判断逻辑代码。当我们的对象不是上面的3个而是10个或更多时,这个函数会成为一个庞大的超级函数,变得难以维护。
所以,简单工厂只能作用于创建的对象数量较少,对象的创建逻辑不复杂时使用。
抽象工厂模式
js
class User {
constructor(name, role, pages) {
this.name = name;
this.role = role;
this.pages = pages;
}
welcome() {
console.log(`欢迎${this.name}使用本系统`)
}
showPage() {
// js 中没有内置的 abstract
throw new Error(`请实现 showPage 方法`)
}
}
class SuperAdmin extends User {
constructor(name) {
super(name, 'superAdmin', ['home', 'user', 'setting']);
}
showPage() {
console.log(`超级管理员拥有以下页面:${this.pages.join(' ')}`)
}
addUser() {
console.log(`添加用户`)
}
addRight() {
console.log(`添加权限`)
}
}
class Editor extends User {
constructor(name) {
super(name, 'editor', ['home', 'user']);
}
showPage() {
console.log(`编辑拥有以下页面:${this.pages.join(' ')}`)
}
}
function getAbstractUserFactory(role) {
switch (role) {
case 'superAdmin':
return SuperAdmin;
case 'editor':
return Editor;
default:
throw new Error(`没有找到对应的角色`)
}
}
const userClass = getAbstractUserFactory('editor');
const user = new userClass('张三');
user.showPage(); // 编辑拥有以下页面:home user